牢骚

距上一篇文章已经时隔两年还要多了,我不禁感概时光如白驹过隙,而自己仍是少年,不管是身体心理上还是技术上。但是,人生不仅仅是工作一方面,我技术上仍比不上平均水平,不过几年来收获的也是不少。

引言

我明白对称加密、非对称加密、公钥、私钥等各种概念。但是我该怎么操作呢?我接触了openssl。其实,我根本不懂openssl底层逻辑是啥,我只要求查阅资料后会用就行了。不要在我导入了ca证书后,浏览器还展示“不安全”这个页面。
firefox_unsafe
chrome_unsafe
safari_unsafe
edge_unsafe

使用

自己扮演CA机构

自签名证书的问题在于服务器发给访问者的电脑或者浏览器的证书(公钥),访问者不认识,所以显示不安全界面。通常,服务器和访问者通过世界上权威的CA机构(第三方)来相互认识。而现在,服务器要自己做CA机构,然后告诉访问者:“这是我。”

1. 生成ca.key(名字应该是没有关系的)。这个是私钥。

openssl genrsa -out ca.key 4096

解释:

  • -out表示输出到这个文件
  • 4096表示加密位数/复杂度,1024的倍数

2. 生成ca.csr(证书申请文件)。中间环节。

openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"

解释:

  • -new表示新生成
  • -key表示基于哪个私钥生成.csr申请文件
  • -out表示输出到哪个文件
  • -subj用来指定各种信息。不加这个也没问题,他就会终端屏幕上一条一条的让你输入:
    csr_questions
    但是指定了-subj,‘extra attributes’我就不会输入了
    你会发现每一条和用-subj参数是对应的
    内容就写你喜欢的,包括CN(Common Name),这个是CA的信息

    3. 生成ca.crt证书。这个就是我们要发给客户端的。

    openssl x509 -req -days 60 -in ca.csr -signkey ca.key -out ca.crt

    解释:

    • -days表示证书有效期
    • -in输入.csr申请文件
    • -signkey基于哪个私钥
    • -out表示输出到哪个文件

4. 然后

把ca.crt发给访问者,让他双击安装在系统证书区域,或者在浏览器中导入。

生成服务器的证书

1. 生成server.key(名字应该是没有关系的)。这个是私钥。放在nginx配置里。

openssl genrsa -out server.key 2048

解释:

  • 和生成CA的.key文件一样嘛~
  • 选择小一点的2048是因为这个证书是要用来和访问者交互的,稍微小一点更快、请求包更小。CA反正生成了就放那了。

2. 生成server.csr(证书申请文件)。中间环节。

openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"

解释:

  • 和生成CA的.csr文件一样嘛~

3. 生成server.crt(证书)。放在nginx配置里。

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile conf/serverCrt.conf

解释:

  • 要加上这个-CAcreateserial
  • -CA你的ca证书是啥
  • -CAkey你的ca证书的私钥是啥
  • -extfile额外的配置文件路径。

    subjectAltName         = @alt_names
    [ alt_names ]
    IP.1 = xxx.xxx.xxx.xxx
    IP.2 = xxx.xxx.xxx.xxx
    DNS.1 = www.catwoman.com
    DNS.2 = www.posionIvy.com
    • 你可以想到,我们之前做的步骤里,只有在.csr生成的时候有指定过域名相关的信息(通过CN,或者叫Common Name)。这个例子里是www.batman.com。所以访问者只有通过这个域名【才】能使用我们的证书。不然还是“不安全”
    • 而我需要额外的配置文件是因为,我没有域名!!需要这个参数subjectAltName来指定ip。不然访问者就不认了。
    • 这个参数subjectAltName来指定其他的域名。

4. 配置nginx。然后reload。

nginx官方指南:https://nginx.org/en/docs/http/configuring_https_servers.html

重点在
ssl on;
ssl_certificate "{yourCertPath}/server.crt";
ssl_certificate_key "{yourCertPath}/server.key";

# Settings for a TLS enabled server.
#
server {
   listen       {yourPort} ssl http2 default_server;
   listen       [::]:{yourPort} ssl http2 default_server;
   server_name  _;
   ssl on;
   root         {yourRootPath};

   ssl_certificate "{yourCertPath}/server.crt";
   ssl_certificate_key "{yourCertPath}/server.key";
   ssl_session_cache shared:SSL:1m;
   ssl_session_timeout  10m;
   ssl_ciphers PROFILE=SYSTEM;
   ssl_prefer_server_ciphers on;

   # Load configuration files for the default server block.
   include /etc/nginx/default.d/*.conf;

   location / {
   }

   error_page 404 /404.html;
       location = /40x.html {
   }

   error_page 500 502 503 504 /50x.html;
       location = /50x.html {
   }
}

更新证书

由于我没有域名,公网ip又会变化,当他变化的时候我就需要更新我的server.crt,不然就会提示“不安全”。

重新执行【生成服务器的证书】的第3步。只是将他的配置文件中subjectAltName👉[ alt_names ]👉IP.1修改成新的ip,然后再重新生成一下证书,然后再reload一下nginx。万事大吉!

查看证书

取决于你是如何生成各类文件的。

openssl rsa -in ca.key -text -noout
openssl req -in ca.csr -text -noout
openssl x509 -in ca.crt -text -noout

总结

完成后的证书列表像这样。ca.srl用来存放【被吊销的证书】,涉及到服务器怎么相信访问者是访问者。

[xxx@localhost xxx]$ ls -l
总用量 28
-rw-r--r-- 1 appadmin appzone 2017 7月   3 13:25 ca.crt
-rw-r--r-- 1 appadmin appzone 1752 7月   3 13:24 ca.csr
-rw------- 1 appadmin appzone 3247 7月   3 13:03 ca.key
-rw-r--r-- 1 appadmin appzone   41 7月   3 14:21 ca.srl
drwxr-xr-x 2 appadmin appzone   62 7月   3 14:19 conf
-rw-r--r-- 1 appadmin appzone 1708 7月   3 14:21 server.crt
-rw-r--r-- 1 appadmin appzone 1058 7月   3 13:27 server.csr
-rw------- 1 appadmin appzone 1679 7月   3 13:16 server.key
[xxx@localhost xxx]$ 

我们发现,生成CA的证书和生成server的证书基本上都是一样的。当然还有很多拓展的命令,比如在生成.key的是后指定密码算法(rsa、des。。。)、再比如在验证证书的时候,指定必须/可选校验不同信息、再比如使用配置文件。

不管怎么样,现在,访问者应该能识别这确实是服务端送过来的响应。chrome、edge、safari都是能识别系统的根证书的,说明访问者双击ca.crt安装在系统就行了。而firefox貌似是不支持的,必须要导入到firefox自己的证书列表里。位置如下截图,请注意在【证书颁发机构里】导入。
firefox_certs

将你的ca.crt通过邮件?微信?短信?发送给访问者。
另外,我们还可以参考一下这个文档:openssl参考文档


BreezingSummer
45 声望0 粉丝

引用和评论

0 条评论