HTTPS证书的 生成与配置 - keytool

2,394 阅读4分钟

前言

最新申请安全、免费的HTTPS证书,详见另一篇文章:

juejin.cn/post/698795…

一、环境说明

内网环境,前后端分离,nginx部署前端服务,springbot部署后端服务。

二、证书获取途径

1、正规机构颁发

优点:正规,浏览器校验通过。

缺点:需要通过真实的域名去申请,并按年交纳一定费用。

2、自行签发

优点:自行通过证书生成工具生成,无需绑定域名方便免费,使用服务器IP即可生成证书。

缺点:因无法校验颁发机构,,浏览器提示不安全。

三、keytool生成证书

原因

因为是内网环境,没有域名,无法从各个收费(免费)的机构申请证书。

【颁发证书的流程就是证书颁发机构需要到服务器上检验该网站的确属于你,这是一个必要步骤,这也是内网申请不到证书的原因。】

咨询正规机构可知,有两种方法:

1、自签证书(本人使用jdk自带的keytool工具生成,还可用openssl等途径)

2、自搭认证证书服务器(未深入探究,求教)

步骤

1、生成私钥key.pem

定位到密钥文件夹下运行cmd,执行如下命令:

keytool -genkey -alias mytest -keyalg RSA -keystore key.pem

名字姓氏:输入提供服务的域名/IP地址/URL中的某个段落/localhost,其他输入项随意。

通常为了方便,密钥库口令和别名mytest的密钥的口令一致。

命令执行完后文件夹下出现key.em私钥文件。

image.png

2、生成证书cert.pem

keytool -export -file cert.pem -alias mytest -keystore key.pem

输入密钥库口令,执行完后文件夹下出现cert.pem证书文件。

image.png

3、转换格式

转格式命令很多,但有些格式转换需要使用openssl,而装openssl有些麻烦,在此提供一个网站

myssl.com/cert_conver…

上述命令生成的私钥为JKS类型

原格式:JKS

目标格式:PEM(nginx只能识别PEM的)

证书文件:上传私钥key.pem

原文件密码:创建私钥key.pem设置的密码

解压密码:转换为 PEM 时,你得到 .zip 压缩文件的密码。

image.png

转换完的文件:

证书文件mytest,查看类型为.cer,记事本打开查看格式为pem类型。

私钥文件mytest.key,记事本打开查看格式为pem类型。

image.png

4、安装证书

双击证书文件mytest.cer,按照提示进行安装,最后提示不受信任(因为是自签的),确定即可。

image.png

image.png

5、nginx配置

因为只要求前端对外提供HTTPS访问,前后端之间的接口仍然使用HTTP协议,所以只需要配置nginx即可。

server {
	listen       443 ssl;
	#ssl on;
	server_name  10.10.25.21; // 需要与创建私钥key.pem时设置的名字姓氏保持一致

	ssl_certificate      E:/mytest/mytest.cer; // 格式转换后的证书文件
	ssl_certificate_key  E:/mytest/mytest.key; // 格式转换后的私钥文件

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;

	ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
	
	ssl_ciphers  HIGH:!aNULL:!MD5;
	
	ssl_prefer_server_ciphers  on;

	location / {
		root   E:/……/dist/; // 前端dist路径
		if (!-e $request_filename) {
			rewrite ^(.*)$ /index.html;
		}
	}

	location ~*\.(js|css|png|jpg|jpeg|gif|ico)$ {
		root   E:/……/dist/; // 前端dist路径
		expires 30d;
	}

	location /api {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header Host $http_host;
		proxy_pass http://localhost:8085/; // 后端接口调用地址,仍然使用http调用
	}
}

启动nginx,打开浏览器,访问https://10.10.25.21:443,能正常访问,但提示不安全,证书是无效的。

因为颁发者信息无法查询,浏览器不信任,只有正规CA机构颁发的浏览器才认同。

image.png

注意点

1、生成私钥时,切记 -keyalg RSA 不然默认的是DES

虽然启动nginx不报错,但是访问HTTPS对应端口,浏览器报错:

无法建立安全连接

2、若证书格式不对,启动nginx时报错(查看nginx的error日志文件):

[emerg] 9632#11880: PEM_read_bio_X509_AUX("E:/keytest/cert.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE) 虽然后缀是pem文件类型是pem,但并不代表编码格式是pem。

可以通过记事本打开私钥key.pem、证书cert.pem文件查看,pem编码格式应该类似如上“3、转换格式”图2所示。

3、若私钥格式不对,启动nginx时报错(查看nginx的error日志文件):

SSL_CTX_use_PrivateKey_file("E:/keytest/key.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: ANY PRIVATE KEY error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)

查看nginx的error日志文件很重要,可以定位很多问题!

4、-genkey即-genkeypair,keytool命令说明详见官方文档

docs.oracle.com/javase/8/do…

四、后续

因为自签的证书浏览器显示不安全,很扎眼,于是有了如下尝试:

1、拿到同事通过域名www.xxx.com申请到,已安装使用的证书、私钥文件。

cert.pem、key.pem

2、修改nginx配置

listen       9443 ssl; // 为了防止与他们的服务冲突改443为9443
server_name  www.xxx.com;
ssl_certificate      E:/xxx/cert.pem;
ssl_certificate_key  E:/xxx/key.pem;

3、修改host文件

将本机(也就是服务器)的域名改成和他们的一致

C:\Windows\System32\drivers\etc\host

host文件追加一行:

127.0.0.1 www.xxx.com

4、启动nginx

浏览器访问www.xxx.com:9443,能正常访问,无不安全提示,证书是有效的。

五、思考

这………岂不是只要申请一个域名和证书,内网环境都修改成相同的域名就能共用证书了,不是省了一笔吗? 当然,内网的客户端每台机器都要去配置host文件,将服务器IP及其域名写上。或者内网的dns上配置一下服务器IP及其域名就行了???