基于 OpenSSL 自建 CA 和颁发 SSL 证书

栏目: 服务器 · 发布时间: 9年前

内容简介:基于 OpenSSL 自建 CA 和颁发 SSL 证书

自建 CA 颁发证书不仅可以用来鉴权,而且使你的通信更加的安全(请保护好你的证书)。在实际的软件开发中,越来越多的服务用到 HTTPS,证书的需求随之增加。那么对于我们开发者,通过自签名证书来进行测试必将非常的方便。so,有一个自己的 CA 是不是非常的库呢!下面我们一步步操作,创建我们自己的 CA。

由于 Mac 自带的 openssl 版本过低,请安装更高版本。

建立 CA 目录

所有命令均在同一目录执行,没有进行跳转。

$ mkdir -p ./demoCA/{private,newcerts} && \
    touch ./demoCA/index.txt && \
    touch ./demoCA/serial && \
    echo 01 > ./demoCA/serial

通过以上命令,你将得到如下目录:

$ tree
.
└── demoCA
    ├── index.txt
    ├── newcerts
    ├── private
    └── serial

生成 CA 根密钥

$ openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048 #可以去掉des,以后签证书不用输密码

生成 CA 证书请求

$ openssl req -new -days 3650 -key ./demoCA/private/cakey.pem -out careq.pem

自签发 CA 根证书

$ openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.pem

以上两步可以合二为一

$ openssl req -new -x509 -days 3650 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

到这里,我们已经有了自己的 CA 了,下面我们开始为用户颁发证书。

为用户颁发证书

生成用户 RSA 密钥

$ openssl genrsa -des3 -out userkey.pem 2048 # 4096

生成用户证书请求

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem # NO SAN

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem -config openssl.cnf #SAN

使用 CA 签发证书

$ openssl ca -in userreq.pem -out usercert.pem # NO SAN

$ openssl ca -in userreq.pem -out usercert.pem -config openssl.cnf -extensions v3_req #SAN

其他证书操作

  • 查看证书的内容: $ openssl x509 -in cert.pem -text -noout
  • 吊销证书: $ openssl ca -revoke cert.pem -config openssl.cnf
  • 证书吊销列表: $ openssl ca -gencrl -out cacert.crl -config openssl.cnf
  • 查看列表内容: $ openssl crl -in cacert.crl -text -noout

openssl.cnf

上面步骤中,你可以观察到 SAN 与 NO SAN 标记。那么什么是 SAN ,SAN(Subject Alternative Name)是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。所以,只执行 NO SAN 命令也可以签发证书,不过却不能够添加多个域名。

想要添加多个域名或泛域名,你需要使用到该扩展。那么默认的 OpenSSL 的配置是不能够满足的,我们需要复制或下载一份默认的 openssl.cnf 文件到本地。如 github openssl 。这里我已经准备好一份 openssl.cnf 。

修改匹配策略

默认匹配策略是:国家名,省份,组织名必须相同(match)。我们改为可选(optional),这样避免我们生成证书请求文件时(csr)去参考 CA 证书。

# For the CA policy
[ policy_match ]
countryName         = match
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName      = optional
commonName          = supplied
emailAddress            = optional

修改默认值

这是可选项,修改默认值,可以让你更快的颁发证书,一直回车就可以了:

[ req_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default     = CN
countryName_min         = 2
countryName_max         = 2

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = Shanghai

localityName            = Locality Name (eg, city)
localityName_default        = Shanghai

0.organizationName      = Organization Name (eg, company)
0.organizationName_default      = deepzz

# we can do this but it is not needed normally :-)
#1.organizationName     = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd

organizationalUnitName      = Organizational Unit Name (eg, section)
organizationalUnitName_default  = deepzz

关键步骤

最关键的地方是修改 v3_req 。添加成如下:

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints        = CA:FALSE
keyUsage            = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName          = @alt_names

[ alt_names ]
DNS.1 = abc.com
DNS.2 = *.abc.com
DNS.3 = xyz.com
IP.1 = 127.0.0.1

每次如果你要签发不同域名或 IP,可以直接修改 [ alt_names ] 。

注意之后的操作,均要指定 -config openssl.cnf 。

再来看看我们的目录结构:

$ tree
.
├── demoCA
│   ├── cacert.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── newcerts
│   │   └── 01.pem
│   ├── private
│   │   └── cakey.pem
│   ├── serial
│   └── serial.old
├── openssl.cnf
├── usercert.pem
├── userkey.pem
└── userreq.pem

本文链接: , 参与评论 »

-- EOF --

发表于 2017-05-21 16:03:00 ,并被添加「openssl、ca」标签。


以上所述就是小编给大家介绍的《基于 OpenSSL 自建 CA 和颁发 SSL 证书》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

垃圾收集

垃圾收集

琼斯 / 谢之易 / 人民邮电出版社 / 2004-4-1 / 45.00元

书围绕着动态内存自动回收的话题,介绍了垃圾收集机制,详细分析了各种算法和相关技术。 本书共12章。第1章首先介绍计算机存储器管理的演化和自动内存回收的需求,并引入了本书所使用的术语和记法。第2章介绍了3种“经典”的垃圾收集技术:引用计数(reference counting)、标记-清扫(mark-sweep)和节点复制(copying)。 随后的4章更详细地讨论了上述这些垃圾收集方式......一起来看看 《垃圾收集》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码