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

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

内容简介:基于 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

上面步骤中,你可以观察到 SANNO 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 证书》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

LINUX与UNIX Shell编程指南

LINUX与UNIX Shell编程指南

David Tansley / 徐炎、张春萌 / 机械工业出版社 / 2000-6 / 38.00元

本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。一起来看看 《LINUX与UNIX Shell编程指南》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具