假设需要为域名(www.baidu.com)或者 IP (192.168.1.100)生成自签证书。
准备工作(安装mkcert)
服务器可联网
Windows
# Chocolatey
choco install mkcert
# Scoop
scoop bucket add extras
scoop install mkcertLinux(CentOS/Ubuntu等)
# yum
sudo yum install nss-tools
# apt
sudo apt install libnss3-toolsMacOS
1
2
3
4
5
6
7# homebrew
sudo brew install mkcert
sudo brew install nss
# macports
sudo port selfupdate
sudo port install mkcert
sudo port install nss
服务器不可联网
如果服务器不可以联网,先在可联网电脑下载相关程序,并上传到服务器中。
Windows
Linux(CentOS/Ubuntu等)
MacOS
安装
- Windows:将下载文件添加到环境变量PATH中即可
- MacOS/Linux:
chmod u+x mkcert-v*-linux-amd64
cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
生成证书
通过以上步骤可正常安装mkcert,接下来需要使用mkcert生成证书
初始化配置
mkcert -install
为域名生成证书
# 多个域名
mkcert www.baidu.com www1.baidu.com
mkcert *.baidu.com
# 多个IP
mkcert 192.168.1.100 192.168.1.101执行第二步操作后,会在当前目录下生成以下文件,如下:
1
2
3
4
5
6
7
8
9
10
11-bash-4.2# ll
-rw------- 1 root root 1704 Jun 9 13:45 www.baidu.com-key.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 www.baidu.com.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 www1.baidu.com-key.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 www1.baidu.com.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 *.baidu.com-key.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 *.baidu.com.pem
-rw------- 1 root root 1704 Jun 9 13:45 192.168.1.100-key.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 192.168.1.100.pem
-rw------- 1 root root 1704 Jun 9 13:45 192.168.1.101-key.pem
-rw-r--r-- 1 root root 1493 Jun 9 13:45 192.168.1.101.pem以上文件将在nginx中配置,如下:
1
2
3
4
5
6
7server {
listen 443 ssl;
server_name www.baidu.com;
ssl_certificate /root/ssl/www.baidu.com.pem;
ssl_certificate_key /root/ssl/www.baidu.com-key.pem;
...
}查看自签证书的根证书,将在【验证】环节使用
1
2
3
4
5
6
7
8-bash-4.2# mkcert -CAROOT
/root/.local/share/mkcert
-bash-4.2# cd /root/.local/share/mkcert
-bash-4.2# ll
total 8
-r-------- 1 root root 2484 Jun 9 13:37 rootCA-key.pem
-rw-r--r-- 1 root root 1651 Jun 9 13:37 rootCA.pem
-bash-4.2#其中rootCA.pem即为根证书,留作后用
Nginx配置
- 配置
1
2
3
4
5
6
7
8
9server {
listen 443 ssl;
server_name www.baidu.com;
ssl_certificate /path/to/your/ssl/www.baidu.com.pem;
ssl_certificate_key /path/to/your/ssl/www.baidu.com-key.pem;
# 其他配置
} - 验证、重启
# 验证
nginx -t
# 重启
nginx -s reload
验证
浏览器直接访问该域名,会出现以下错误:
并且在地址栏会提示域名证书错误:
点击地址栏红色的不安全,检查证书是否被替换成上面的自签证书
两种处理证书错误的方案:
安装根证书(但是需要在每一台访问的客户端都需要进行操作)
将前面在服务器上执行
mkcert -CAROOT
得到的根证书rootCA.pem
分发给每一个用户Windows上,需要将该证书重命名为
rootCA.crt
,然后双击或者右键选择安装证书Mac上参考https://blog.csdn.net/qq_43004620/article/details/137969884进行配置
仅忽略异常
两种方案的弊端
- 证书有过期时间,默认是1年,也可设置成别的时间,过期后,需要重新安装,且每一个客户端都需要进行操作,但是浏览器地址栏不会再显示不安全的提示
- 只需要客户端在页面警告时,点击继续前往即可,不存在证书过期再重新安装的问题,但是浏览器地址栏会一直显示不安全的提示。
如果点击页面的高级后无继续前往…按钮,则需要进行以下步骤:
浏览器地址栏输入以下地址,访问
输入自签证书的域名,然后点击Delete按钮,即可看到**继续前往…**按钮
如何让Java程序信任该自签证书
解决自签证书,在Java程序中不被信任的临时解决方案:
- 以root用户进入容器:
docker exec -u root -it container_name bash
- 导出服务端证书
# xxx.xxx.xxx.xxx:8080:使用自签证书的域名及端口
echo | openssl s_client -connect xxx.xxx.xxx.xxx:8080 2>/dev/null | openssl x509 > server.crt - 导入JVM信任库(默认密码:changeit)
keytool -import -alias server-cert -file server.crt -keystore $JAVA_HOME/lib/security/cacerts
- 重启容器(注意:这里不能使用docker-compose up -d命令,这会删除容器,重新创建容器)
docker restart container_name
- 每次更新完成后(recreate容器后),都需要执行上述操作