使用Openssl生成自签证书

6 篇文章 0 订阅
3 篇文章 0 订阅

证书生成流程

openssl genrsa
openssl req
openssl x509
openssl genrsa
openssl req
openssl ca
openssl genrsa
openssl req
openssl ca
start
ca.key
ca.csr
ca.cert
server.key
server.csr
server.cert
ca.key
ca.cert
client.key
client.csr
client.cert
ca.key
ca.cert

生成CA

# 生成CA私钥(ca.key)
openssl genrsa -des3 -out ca.key 2048 
# 生成CA证书签名请求(ca.csr)
openssl req -new -key ca.key -out ca.csr
# 生成自签名CA证书(ca.cert)
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt

生成Server证书

# 生成服务端私钥(server.key)
openssl genrsa -des3 -out server.key 2048 
# 生成服务端证书签名请求(server.csr)
openssl req -new -key server.key -out server.csr
# 使用ca证书签署服务端csr以生成服务端证书(server.cert)
openssl ca -days 3650 -in server.csr -out server.crt -cert ca.crt -keyfile ca.key 

生成Client证书(用于双向认证)

# 生成客户端私钥(client.key)
openssl genrsa -des3 -out client.key 2048
# 生成客户端证书签名请求(client.csr)
openssl req -new -key client.key -out client.csr
# 使用ca证书签署客户端csr以生成客户端证书(client.cert)
openssl ca -days 3650 -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

查看证书内容

openssl x509 -in server.crt -noout -text

在这里插入图片描述

生成证书时遇到的问题

问题1:生成证书时的subject具体含义
Subject: C=CN, ST=ln, L=sy, O=mx, OU=tsp2, CN=localhost

C = countryName=国家
S = stateOrProvinceName=省
L = localityName=城市
O = organizationName=公司
OU = organizationalUnitName=部门
CN = commonName=域名

问题2:提示./demoCA/newcerts不存在

在使用ca证书签署server证书时,遇到如下错误:提示./demoCA/newcerts不存在,可按照如下操作在当前工作目录新建demoCA, demoCA/newcerts, demoCA/index.txt, demoCA/serial,并设置serial内容为01+空行
在这里插入图片描述在这里插入图片描述

问题3:重复生成同commonName证书后,提示:证书已存在

在这里插入图片描述
相同域名重新生成client.csr时会提醒there is already a certificate已经有一个证书了。那就把当前证书撤销,然后再重新运行即可。其中01.pem为demoCA/newcerts下的多个pem文件之一,默认按照创建顺序01, 02, …,需要自行确定pem中commonName为重复的域名后,方可吊销对应pem。
在这里插入图片描述
撤销证书命令如下:

openssl ca -keyfile ca.key -cert ca.crt -revoke .\demoCA\newcerts\01.pem

配置Nginx证书

例如按照上述生成CA、生成Server证书的流程,生成localhost的证书(则生成server证书时需要指定commonName为localhost,通常commonName即为服务器对应的域名),生成完成后将本地Nginx上443端口配置生成的server.cert, server.key,配置如下:

    # HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;
    
        ssl_certificate      D:/work_dir/CA/mqtt/server.crt;
        ssl_certificate_key  D:/work_dir/CA/mqtt/server.key;
        # https双向认证
        #ssl_verify_client on;
        #ssl_client_certificate ca.crt;
           
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
    
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
    
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

启动Nginx后,发现443并未好用,查看Nginx错误日志发现如下报错:

2020/08/21 14:36:18 [emerg] 5588#20032: 
cannot load certificate key "D:/work_dir/CA/mqtt/server.key": PEM_read_bio_PrivateKey() failed (
SSL: error:2807106B:UI routines:UI_process:processing error:
while reading strings error:0906406D:PEM routines:PEM_def_callback:
problems getting password error:0906A068:
PEM routines:PEM_do_header:bad password read
)

nginx启动的时候需要输入server.key的密码,解决办法是可以使用原key来生成解密后的key,并以解密后的key来代替,如下通过原server.key生成解密后的server_unsecure.key:

openssl rsa -in server.key -out server_unsecure.key

之后修改Nginx配置文件如下:
在这里插入图片描述
重新加载nginx后,即可访问该Https证书了
在这里插入图片描述

Chrome中自签证书不安全问题

导入自签CA证书到操作系统

关于证书不安全的提示,是由于我们自签名的CA证书不是权威机构,操作系统不承认所导致,可以将我们自己的CA安装到操作系统中
在这里插入图片描述
在windows系统可通过运行certmgr.msc来查看本地已安装证书:
在这里插入图片描述
在导入ca证书后,浏览器仍提示"不安全"
在这里插入图片描述

设置证书"使用者可选名称SAN"

查询相关资料后发现,新的chrome浏览器需要为自签证书设置SAN(使用者可选名称,subject alternative name)
在这里插入图片描述
关于openssl设置SAN可以参考:使用openssl为ssl证书增加“使用者备用名称(DNS)”
我在学习ssl阶段使用的openssl命令,后续操作的时候都使用xca(一个生成证书的图形化工具),在xca中设置SAN如下:
在这里插入图片描述
重新生成证书、重新加载配置后,可以发现此时浏览器不再报"不安全"了,同时查看证书可以发现"使用者可选名称"已被添加
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗小爬EX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值