有域名
付费
各大云平台服务商都有卖SSL证书,价格不等
免费
目前已知的,阿里云(数字证书管理服务-SSL 证书 - 免费证书 - 创建证书)可以领取买免费额度(一年内20个DV(域名型 SSL 证书))每年都有额度
没有域名
自签名证书
自己给自己签名,自己给自己做背书,即使是用 HTTPS 访问,浏览器依旧会提示不安全的连接,按需使用
在开发或者测试环境可以这样搞, 生产环境下还是乖乖的买个域名
一、生成SSL证书
\1. 生成SSL密钥
访问网站生成SSL密钥文件和CSR文件,csr.chinassl.net
域名就填写IP地址就好,然后点击 “生成CSR”文件,此时会生成2个文件,分别是CSR文件和KEY文件,分别点击
下载,分别保存为“your_ip_csr.txt”文件和“your_ip_key.txt”文件。
\2. 生成SSL证书
访问网站生成SSL证书,csr.chinassl.net,上传“your_ip_csr.txt”文件后
点击“获取免费证书”,证书生成后点击“下载证书文件”,保存为“your_ip_ssl.crt”文件
\3. 重命名密钥文件和SSL证书文件
重命名“your_ip_key.txt”文件名为“your_ip.private”
部署
Nginx 添加 SSL 模块
使用 ./nginx -V 查看信息,查看 config argment 参数
添加./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_ssl_module
主要是最后面一个
执行 make
更新 nginx 启动文件
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name 127.0.0.1; // 我在添加这个之后就请求异常 请求:192.168.135.194api/login
location / {
rewrite ^/(.*) https://$host$1 permanent; # 重定向到https
}
}
server {
listen 443 ssl;
server_name 127.0.0.1; // 我在添加这个之后就请求异常 请求:192.168.135.194api/login
ssl_certificate /etc/ssl/my_domain/my_domain.ssl; # ssl证书存储路径
ssl_certificate_key /etc/ssl/my_domain/my_domain.private; # 秘钥存储路径
# ssl的一些配置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #开启TLS协议
location / {
root html;
index index.html index.htm;
}
}
server_name的解释:就是为了配置域名
server {
listen 8088;
server_name www.aa.com; # 定义使用 www.nginx.cn访问
location = /50x.html {
root html;
}
}
server {
listen 8088;
server_name www.bb.com; # 定义使用 www.nginx.cn访问
location = /50x.html {
root html;
}
}
443端口转发
https的默认端口是443,而没有root权限的用户启动时,nginx会提示没有权限使用443端口,此时则需要使用端口转发规则,把443转发到其它端口,如8443。那么需要root用户执行以下命令
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
iptables -t nat -nL --line
service iptables save
然后把nginx配置文件的监听端口改成8443 ssl
server {
listen 80;
server_name 127.0.0.1;
location / {
# 重定向到https,https默认端口是443,因为端口转发规则,转发到8443
rewrite ^/(.*) https://$host$1 permanent;
}
}
server {
listen 8443 ssl;
server_name 127.0.0.1;
...
}
Nginx 配置文件
server {
listen 443 ssl;
server_name 127.0.0.1;
ssl_certificate /etc/ssl/your_ip.crt; # ssl证书存储路径
ssl_certificate_key /etc/ssl/your_ip.private; # 秘钥存储路径
# ssl的一些配置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #开启TLS协议
location / {
root html;
index index.html index.htm;
}
}
证书有效期一般都是一年,不超过13个月,网站需要一年更新一次
证书查询
自制SSL证书
自制SSL证书需要生成两种证书:CA机构证书、服务器证书。
服务器证书是由CA机构颁发,安装在服务器上,例如nginx、tomcat等;
CA机构证书提供给各个客户端安装,常用浏览器、手机等已经内置了各大常用CA机构的证书,但我们自制证书就需要手动安装了。
nginx结合openssl实现https的方法_nginx_脚本之家
mkcert-自制证书
mkcert 是一个用于生成本地自签名 SSL 证书的开源工具,项目基于 Golang 开发,可跨平台使用,不需要配置,支持多域名以及自动信任 CA。
下载地址:https://github.com/FiloSottile/mkcert/releases
cp mkcert-v1.4.4-linux-amd64 mkcert
#重新命名
chmod +x mkcert
# 增加执行权限
./mkcert -version
# 执行测试命令,会返回mkcert当前版本号为1.4.4
生成CA证书
mkcert 支持自动信任 CA,需要在服务器生成CA 证书,并在客户端安装,以解决私有证书在客户端不受信任的问题。
mkcert -install
# 在服务器生成CA证书
mkcert -CAROOT
# 查看证书位置
我查看到的路径 /root/.local/share/mkcert
可以看到目录下有两个文件:rootCA-key.pem 和 rootCA.pem ,把 rootCA.pem 拷贝到客户端,重命名为rootCA.crt,双击安装即可。
生成服务器证书
./mkcert 域名1 域名2 域名3...
#生成服务器证书方式一:直接生成
在当前目录生成xxx.pem和xxx-key.pem两个文件
./mkcert -cert-file ./server.crt -key-file ./server.key 域名1 域名2 域名3...
#生成服务器证书方式二:指定证书名和私钥名
在当前目录生成server.crt和server.key两个文件
./mkcert -help
# 查看mkcert更多用法
openssl-自制证书
由于mkcert在生成证书时命令很简单,相应的可选配置也较少,例如无法约定证书的有效期等等,所以一般用于测试使用,在正式环境中最好还是使用openssl,下面是使用openssl制作ssl证书的步骤:
生成CA证书
openssl genrsa -des3 -out myCA.key 2048
# 生成CA私钥文件 myCA.key,需要设置CA私钥密码
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 36500 -out myCA.crt -subj "/C=CN/ST=ca-province/L=ca-city/O=ca-org/OU=ca-group/CN=ca-domin"
# 生成CA证书myCA.crt,需要验证CA私钥密码
openssl x509 -in myCA.crt -noout -text
# 查看CA证书内容
生成的CA证书可直接拷贝至客户端双击安装,与上面安装CA证书动图中的步骤一样
生成服务器证书
openssl genrsa -out server.key 2048
# 生成服务器私钥文件server.key
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=server-province/L=server-city/O=server-org/OU=server-group/CN=192.168.20.20/CN=192.168.20.50/CN=localhost"
# 生成服务器证书申请文件server.csr
vi cert.ext
# 创建服务器证书配置文件cert.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.2 = 192.168.20.20
IP.3 = 192.168.20.50
openssl x509 -req -in server.csr -out server.crt -days 36501 -CAcreateserial -CA myCA.crt -CAkey myCA.key -CAserial serial -extfile cert.ext
#用CA证书和CA私钥文件签署服务器证书server.crt
Nginx安装SSL证书
docker安装nginx过程参考:Docker安装Nginx_日华子文的博客-CSDN博客_docker nginx安装
cp soft/ssl/server.crt docker-nginx/conf/
cp soft/ssl/server.key docker-nginx/conf/
# 拷贝证书至docker挂载配置文件的目录
vi docker-nginx/conf/default.conf
# 修改配置文件default.nginx,在文件最下方添加server
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
#server_name cloud.tencent.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/conf.d/server.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/conf.d/server.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
root /usr/share/nginx/html;
index index.html index.htm;
}
}
注意此处证书的路径要填写容器内配置文件目录的绝对路径,或nginx.conf的相对路径
docker restart nginx
# 重启nginx容器
docker logs -ft --tail 100 容器名
#如果启动失败,可以查看容器日志排查问题
重启浏览器访问nginx
过程参考资料:
mkcert 使用指南:如何快速创建自签名 SSL 证书_Xpitz的博客-CSDN博客_mkcert
https://gist.github.com/liuguangw/4d4b87b750be8edb700ff94c783b1dd4
SSL 证书 Nginx 服务器 SSL 证书安装部署-证书安装-文档中心-腾讯云
证书格式转换
上面的操作中,生成的都是crt/key证书,nginx可以直接使用,但如果想要在tomcat中使用的话,就需要转换证书格式为jks,下图是各大主流中间件对应的的证书格式类型。
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
#crt/key转换为pfx
keytool -importkeystore -srckeystore server.pfx -destkeystore server.jks -srcstoretype PKCS12 -deststoretype JKS
#pfx转换为jks
Tomcat安装SSL证书
修改server.xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="D:\ssl\server.jks"
certificateKeystorePassword="123456"
type="RSA" />
</SSLHostConfig>
</Connector>
重启tomcat
更多证书格式转换参考: