利用OpenSSL生成自签名TLS/SSL证书,由于此证书非权威CA机构颁发,因此在浏览器等客户端访问经此证书加密的网站还需要手动安装CA根证书。
主要步骤为①创建CA服务器,生成CA Private KEY和CA证书,②生成服务端的证书,*③可选步骤,如果需要双向认证则生成客户端的证书
搭建CA服务器步骤
生成CA RSA私钥文件
openssl genrsa -out ca.key 2048
生成CA CSR请求签署文件
Cerificate Signing Request
即证书请求文件,生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由CA来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):用户生成自己的公私钥对,构造自己的证书申请文件,符合PKCS#10标准,用户将证书申请文件提交给CA。
可以理解为到证书之间的一个过程文件,带有一些扩展信息,如果直接带向x509也可以不生成CSR,直接生成证书文件。
openssl req -new -out ca.csr -key ca.key
提示:上面的命令输入后会弹出要求输入国家、组织信息的交互解密,也可以使用-subj直接输入则不会有交互解密
openssl req -new -out ca.csr -key ca.key -subj '/C=CN/ST=BJ/L=BJ/O=CA/OU=CA/CN=ca.com/'
生成CA自签证书
openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -days 3650
*导出P12证书
Windows系统也认P12证书,如果需要导出P12证书可以用以下命令,其中ca.pem也可以是ca.crt
openssl pkcs12 -export -clcerts -in ca.pem -inkey ca.key -out ca.p12
至此CA 证书服务器已经搭建完成
根据CA给服务端颁发证书
生成服务端RSA私钥
openssl genrsa -out server.key 2048
生成服务端CSR请求签署文件
openssl req -new -key server.key -out server.csr
提示:上面的命令输入后会弹出要求输入国家、组织信息的交互解密,也可以使用-subj直接输入则不会有交互解密。此文件中的国家、州、地区以及公司名字可以与CA不一致
openssl req -new -key server.key -out server.csr -subj '/C=CN/ST=GuangDong/L=Shenzhen/O=MIA/OU=DEV/CN=*.domain.com/'
Chrome的验证机制较严,还需要加扩展文件信息
vi req.ext
信息示例如下,注意SubjectAlternativeName下的DNS可以与CN不一致,可以多加几个如DNS.2=add.new.com,加多少个都是SSL证书最终认可的域名
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
DNS.1=*.domain.com
签署服务端证书
如果要生成PEM证书即将server.crt后缀改为.pem即可
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -days 3650 -extfile req.ext -set_serial 1
*根据CA给客户端颁发证书
客户端证书主要是用于服务端与客户端数据传输双向认证的过程,一般场景较少
说明:以下步骤具体没有验证过,可以参考服务端的过程
生成客户端RSA私钥
openssl genrsa -out client.key 2048
生成客户端CSR请求签署文件
openssl req -new -key client.key -subj "/CN=m.miacraft.cn" -out client.csr
签署客户端证书
如果要生成PEM证书即将client.crt后缀改为.pem即可
openssl req -x509 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.crt
*参数与配置说明
证书补充信息字段说明
-subj参数
字段 | 简写代表 | 说明 |
---|---|---|
Country Name | C | 国家代号,ISO国家代码了,如中国为CN |
State or Province Name | ST | 省或州名称 |
Locality Name | L | 地区名称,如城市 |
Organization Name | O | 组织名称,公司名称 |
Organizational Unit Name | OU | 组织单元,部门 |
Common Name | CN | 必须输入项,通用名称,此处可以为域名,可以用通配符表示域名如*.domain.com |
Email Address | emailAddress | 邮箱地址 |
CA配置文件说明
默认文件位置/etc/pki/tls/openssl.cnf
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ] //定义openssl作为CA使用时相关配置
dir = /etc/pki/CA # openssl作为CA使用时路径
certs = $dir/certs # 已颁发证书的存储位置
crl_dir = $dir/crl # 已吊销证书的吊销列表的存放位置
database = $dir/index.txt # 证书索引文件 (默认没有需要创建)
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # 新颁发证书的存储位置
certificate = $dir/cacert.pem # CA的公钥文件名
serial = $dir/serial # 记录过去签发的所有证书的序列号【每签发一个证书 自动+ 1】 (文本文件 需要创建)
crlnumber = $dir/crlnumber # 已吊销证书编号
crl = $dir/crl.pem # 证书吊销列表
private_key = $dir/private/cakey.pem# CA自己的私钥文件
RANDFILE = $dir/private/.rand # 随机数的获取位置 (隐藏文件)
x509_extensions = usr_cert # 用户证书
default_days = 365 # 颁发证书默认有效时间
default_crl_days= 30 # how long before next CRL
default_md = default # use public key default MD
preserve = no # keep passed DN ordering
==============================================================================
[ policy_match]
此段为证书相关信息选项,其中match指定的项,要求被签名证书一定要与CA的对应项一致。
[ req_distinguished_name ]
此段为CA证书的默认配置
其它依赖的文件
如果在创建CA证书和服务端证书的时候没有指定路径,则使用默认的配置中的路径,为了能使证书可以工作还需要创建两个依赖文件
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
文件名 | 说明 |
---|---|
index.txt | 证书索引文件,里面会有证书的扩展信息,如国家、地区、组织等 |
serial | 记录签发证书的序列号,所以创建后要对其赋值00或其他,然后每签发一个证书自动+1,示例中使用了set_serial命令是相同的功能 |
openssl命令参数说明
参数 | 说明 |
---|---|
genrsa | 生成RSA密钥 |
-out | 输出位置 |
2048 | 如果是在RSA密钥的时候则为RSA密钥强度 |
-key | 私钥文件,指明从哪个私钥文件中提取公钥创建证书请求 |
-new | 生成新的证书 |
-x509 | 生成自签证书,如果不带则生成CSR证书签署请求文件 |
-days | 证书有效时长 |
-set_serial | 设置证书的序列号,多个证书可设置编号 |
-sha256 | 指定HASH哈希算法为SHA256 |
证书使用
以上步骤(不包含客户端证书)最终产出ca.crt ca.csr ca.key req.ext server.crt server.csr server.key文件,服务端配置的时候使用server.crt和server.key即可。
可以在客户端安装ca.crt证书,则在浏览器访问的时候不会提示“证书不信任”
NGINX安装证书
找到NGINX配置
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate /usr/share/nginx/server.pem;
ssl_certificate_key /usr/share/nginx/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
配置好后需要重启NGINX,每次修改配置或生成新证书都需要重启服务
CentOS 7安装CA根证书
说明:测试没有成功,在使用curl等工具访问仍会提示证书不安全,但是客户端工具一般可以忽略提示,如curl可以使用-k进行忽略
下载的CA证书将其移动到/opt目录
mv ca.crt /opt/
创建软链接
ln -s /opt/ca.crt /etc/ssl/certs/myca.crt
更新证书,如果没有该命令则yum install ca-certificates
update-ca-trust
或者(这个还没测试过,可以试一下)
cp ca.crt /usr/local/share/ca-certificates/xray.crt
update-ca-certificates
Windows安装CA根证书
需要先安装CA证书,则该证书颁发的服务端和客户端证书都是被认证有效的
下载ca.crt证书,双击,点击“安装证书”,将其安装到“受信任的根证书颁发机构”即可
可以打开Windows证书管理器查看是否安装好相关证书,打开CMD使用以下命令,在刚才的路径“受信任的根证书颁发机构”找是否有相关证书
certmgr
安装好后打开浏览器访问相应网页即可
没有安装CA证书则在浏览器查看服务端的证书会使如下情况
参考链接
生成CA和服务端证书,依赖与配置文件的一些参数,很多参数没有手动指定
https://blog.csdn.net/sinat_20184565/article/details/90302294
https://blog.51cto.com/1inux/1638154
出现“缺少主题备用名称”的参考
https://www.itranslater.com/qa/details/2325988825945867264
Consul配置证书
https://segmentfault.com/a/1190000019914825
生成CA和服务端还有客户端,带NGINX配置,还有双向认证的NGINX配置
https://www.jianshu.com/p/b932ca0726f3
OpenSSL Windows下载
3 comments
真棒!
怎么收藏这篇文章?
跟ssl证书有什么区别吗?