一、问题

很多服务或者开源软件部署时要求必须使用https和域名访问,如果没有公网IP,部署在内网,应该怎么支持内部域名和https访问呢?

二、方案

使用openssl命令可以生成私钥和证书。这里介绍一种更简单的方式:使用工具mkcert

以mac为例,使用方法如下:

  1. 安装:brew install mkcert
  2. 安装到本地根证书,否则浏览器会提示“不安全”:mkcert -install
  3. 生成站点证书,把example.com替换为你的域名:mkcert example.com。把生成的私钥和证书文件配置到网站中比如Nginx配置文件中
1
2
3
4
5
6
7
8
9
10
server {
server_name example.com;
listen 8443 ssl;
http2 on;

ssl_certificate /opt/homebrew/etc/nginx/ssl/example.com.pem;
ssl_certificate_key /opt/homebrew/etc/nginx/ssl/example.com.key;
......

}

上面配置完成后,服务器本地Chrome浏览器https访问正常,不会提示“不安全”。但是对于其他主机上chrome浏览器https访问会提示“不安全”。

原因是网站https证书不能通过客户端主机的CA认证。解决方法是把服务端生成的mkcert根证书安装到客户端主机上。操作步骤如下:

  1. 从网站服务端主机上找到mkcert根证书。mac下“钥匙串访问” -> “系统根路径” 下找名字以mkcert开头的证书。根证书“签发者机构”和目标“组织“应该是同一个人,这里是”mkcert development CA“

  1. 右键证书导出为cer根证书文件
  2. 把根证书文件通过scp或者其他方式拷贝到客户端机器上
  3. 以Mac为例,客户端机器上双击cer文件,证书会自动导入到“系统根证书“和“登录”钥匙串中
  4. 注意把“信任”级别从“使用系统默认”调整为“始终信任”

这样客户端机器上chrome浏览器也能访问我们自定义的https网站并且不会提示“不安全”了。