前言
哈喽,小伙伴们,我是泽南Zn👨🎓。最近做项目的时候要求将http升级成https,但是甲方并没有提供证书,所以只能先自己生成然后去演练,本篇文章介绍了通过使用openssl生成自签证书的过程,过程很清晰哦,只要跟着做下去,都会很顺利的生成证书并且完成配置。话不多说,直接进入主题!
一、openssl 简介
openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
官网:www.openssl.org/source/
构成部分:
- 密码算法库
- 密钥和证书封装管理功能
- SSL通信API接口
用途
- 建立 RSA、DH、DSA key 参数
- 建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表)
- 计算消息摘要
- 使用各种 Cipher加密/解密
- SSL/TLS 客户端以及服务器的测试
- 处理S/MIME 或者加密邮件
二、 数字证书 概念
- 在HTTPS的传输过程中,有一个非常关键的角色——数字证书,那什么是数字证书?又有什么作用呢?
- 所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示CA结构对证书持有者的认可。数字证书拥有以下几个优点:
- 使用数字证书能够提高用户的可信度 数字证书中的 公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
- 在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上 X.509证书包含三个文件:
key,csr,crt。
key【密钥/私钥 Private Key】是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
csr【证书认证签名请求 Certificate signing request】是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
crt【证书 Certificate】是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
-req 产生证书签发申请命令
-newkey 生成新私钥 rsa:4096 生成秘钥位数
-nodes 表示私钥不加密
-sha256 使用SHA-2哈希算法
-keyout 将新创建的私钥写入的文件名
-x509 签发X.509格式证书命令。X.509是最通用的一种签名证书格式。
-out 指定要写入的输出文件名
-subj 指定用户信息
-days 有效期(3650表示十年)
三、 基本流程
1、 安装 openssl
yum install openssl -y
2、 虚构一个CA认证机构
# 生成CA认证机构的证书密钥key 注:本文密码以1234为例
# 需要设置密码,输入两次
openssl>openssl genrsa -des3 -out ca.key 1024
# 去除密钥里的密码(可选)
# 这里需要再输入一次原来设的密码
openssl>openssl rsa -in ca.key -out ca.key
# 用私钥ca.key生成CA认证机构的证书ca.crt
# 其实就是相当于用私钥生成公钥,再把公钥包装成证书
openssl>openssl req -new -x509 -key ca.key -out ca.crt -days 365
subj参数说明:
/C=CN # Country 国家
/ST=beijing # State or Province 省
/L=beijing # Location or City 城市
/O=ziqian # Organization 组织或企业
/OU=ziqian # Organization Unit 部门
/CN=ziqian # Common Name 域名或IP
示例:-subj "/C=CN/ST=beijing/L=beijing/O=ziqian/OU=ziqian/CN=ziqian"
# 这个证书ca.crt有的又称为"根证书",因为可以用来认证其他证书
3、 生成网站的证书
用上面那个虚构出来的CA机构来认证,免费生成证书。
# 生成自己网站的密钥server.key (如果设置为 1024 会报错,SSL: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small)
openssl>openssl genrsa -des3 -out server.key 2048
# 生成自己网站证书的请求文件
# 如果找外面的CA机构认证,也是发个请求文件给他们
# 这个私钥就包含在请求文件中了,认证机构要用它来生成网站的公钥,然后包装成一个证书
openssl>openssl req -new -key server.key -out server.csr
# 使用虚拟的CA认证机构的证书ca.crt,来对自己网站的证书请求文件server.csr进行处理,生成签名后的证书server.crt
# 注意设置序列号和有效期(一般都设1年)
openssl>openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
生成的信息:subject=/C=CN/ST=beijing/L=beijing/O=ziqian/OU=ziqian/CN=ziqian/emailAddress=12345@qq.com
至此,私钥server.key和证书server.crt已全部生成完毕,可以放到网站源代码中去用了。可以去服务器的根目录下查看
四、 配置
在 nginx 的配置文件下,新建一个监听443的 server:
upstream page {
server 10.10.10.7:3003 max_fails=20 fail_timeout=60s;
}
server{
listen 443 ssl;
#对应你的域名
server_name ziqian.com;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:1m;
ssl_protocols SSLv2 SSLv3 TLSv1; ##指定密码为openssl支持的格式
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#如果是静态文件,直接指向目录,如果是动态应用,用proxy_pass转发一下
location / {
root /usr/local/service/ROOT;
index index.html;
proxy_pass https://page/api/login; //至此nginx配置完毕
}
}
#监听80端口,并重定向到443
server {
listen 80;
server_name ziqian.com; #证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
}
注意!!!!!!!!!!
Dockerfile里加一行代码
COPY ./docker/ssl /etc/nginx/ssl/
总结
使用openssl生成自签证书并配置到nginx完毕,其中涉及填写一些信息,文中都已标明注释,要记住最开始设置的密码,3位以上,如果忘记了,那就重新来过。至此http也可以升级成https啦~