4、OpenSSL实战:OpenSSL安装、生成自签名证书、配置HTTPS服务、证书格式转换
好,咱们进入第四讲。这一章我打算带大家亲手操练一把OpenSSL。说实话,在PIS系统里,数据加密和通信安全是底线,而OpenSSL就是那个最趁手的工具。我这些年做过的项目,从地铁PIS到高铁旅客系统,几乎每个都离不开它。今天咱们就把安装、生成证书、配HTTPS、格式转换这几个核心操作,一个一个过一遍。
4.1 OpenSSL的安装
先说说安装。OpenSSL这东西,说白了就是个加密工具箱。不同系统安装方式不一样,我分别说说。
4.1.1 Linux系统(以Ubuntu/CentOS为例)
我个人习惯用Linux做服务器,毕竟PIS系统的后端大多跑在Linux上。安装命令很简单:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install openssl libssl-dev
# CentOS/RHEL
sudo yum install openssl openssl-devel
装完之后,验证一下版本:
openssl version
嗯,这里要注意:版本别太老。我遇到过一台老服务器,OpenSSL版本还是0.9.8,结果好多新特性不支持,折腾了半天。建议至少1.1.1以上。
4.1.2 Windows系统
Windows下呢,我建议直接去官网下载安装包。或者用Git Bash,它自带OpenSSL。我个人更推荐后者,省事。
# 在Git Bash中检查
openssl version
如果没装,可以去 slproweb.com/products/Win32OpenSSL.html 下载。安装时记得选「拷贝到系统目录」,这样命令行里就能直接用了。
4.2 生成自签名证书
好,装完了咱们就来生成证书。自签名证书,说白了就是自己给自己签发的证书。在PIS系统开发测试阶段,或者内部网络通信,用自签名证书完全够用。生产环境嘛,还是得用CA签发的,这个后面会讲。
4.2.1 生成私钥
第一步,先生成私钥。私钥就是你的「数字身份」,千万要保管好。
# 生成RSA私钥,2048位
openssl genrsa -out server.key 2048
这里我解释一下:2048位是目前比较安全的长度。1024位已经不够用了,4096位虽然更安全,但性能开销大。PIS系统里,2048位是个不错的平衡点。
4.2.2 生成证书签名请求(CSR)
有了私钥,下一步就是生成CSR。CSR就是向CA申请证书的请求文件,里面包含你的公钥和身份信息。
openssl req -new -key server.key -out server.csr
执行后会让你填一堆信息:国家、省份、城市、组织名、通用名(Common Name)等等。这里有个坑:通用名一定要填你的域名或IP。我见过有人随便填了个「test」,结果浏览器访问时提示证书不匹配。
pis.example.com,那CN就填这个。
4.2.3 生成自签名证书
最后一步,用私钥和CSR生成自签名证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
这个命令的意思是:用私钥 server.key 对CSR进行签名,生成有效期为365天的证书 server.crt。
你想想看,自签名证书和CA签发的证书有什么区别?说白了,就是「自己证明自己」和「别人证明你」的区别。自签名证书浏览器会报不安全,但内部系统用完全没问题。
4.3 配置HTTPS服务
证书有了,接下来就是配置HTTPS。我以Nginx为例,因为PIS系统的Web管理界面大多用Nginx做反向代理。
4.3.1 Nginx配置HTTPS
先找到Nginx的配置文件,一般在 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 下。然后添加一个HTTPS server块:
server {
listen 443 ssl;
server_name pis.example.com;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这里我重点说一下 ssl_protocols 和 ssl_ciphers。TLSv1.0和TLSv1.1已经不安全了,我建议只开TLSv1.2和TLSv1.3。至于加密套件,HIGH:!aNULL:!MD5 的意思是:使用高强度加密,禁用匿名套件,禁用MD5。
4.3.2 测试HTTPS配置
配置完,先测试一下Nginx配置是否正确:
nginx -t
如果提示 syntax is ok,那就重启Nginx:
systemctl restart nginx
然后用浏览器访问 https://pis.example.com。因为是自签名证书,浏览器会提示不安全,点「继续访问」就行。
4.4 证书格式转换
最后说说证书格式转换。不同平台、不同软件对证书格式要求不一样。比如Java用JKS,Windows用PFX,Nginx用PEM。所以转换是家常便饭。
4.4.1 PEM转PFX(用于Windows/IIS)
PFX格式包含私钥和证书,常用于Windows平台。
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx
执行后会让你设置导出密码。这个密码要记住,导入到Windows时会用到。
4.4.2 PEM转DER(用于Java/Android)
DER是二进制格式,Java的keytool工具常用。
openssl x509 -in server.crt -outform der -out server.der
4.4.3 PEM转PEM(其实只是重命名)
有时候只是扩展名不对,比如需要 .pem 而不是 .crt。直接重命名就行:
cp server.crt server.pem
嗯,这里要注意:PEM格式其实就是Base64编码的证书内容,扩展名可以是 .crt、.pem、.cer,内容是一样的。
4.4.4 查看证书信息
不管什么格式,都可以用这个命令查看证书详情:
openssl x509 -in server.crt -text -noout
这个命令会输出证书的颁发者、有效期、公钥信息、扩展项等。我调试证书问题时,这个命令用得最多。
file 命令看一下。PEM格式是文本文件,DER格式是二进制文件。
4.5 实战总结
好,咱们把这一章的内容串一下。OpenSSL的安装、生成自签名证书、配置HTTPS、格式转换,这几个操作是PIS系统安全通信的基础。我建议你跟着命令敲一遍,遇到问题别慌,多半是路径或权限的问题。
最后说一句:证书有有效期,别忘了续期。我见过一个PIS系统因为证书过期,导致所有客户端连不上,那叫一个惨。所以建议在证书到期前一个月就提醒自己。
下一章咱们聊聊更高级的话题:双向认证和证书链。到时候见。