问题

nginx配置自签名ssl证书,来支持https访问nginx,在浏览器中访问nginx时,提示有风险。而访问其他各大网站时,也是使用了https协议,为什么可以直接访问,而不提示有风险呢?

解疑

先从ssl证书说起。是否使用https协议或者说是否使用ssl认证,是后台网站服务器来决定的。如果想使用https协议,则在后台服务中配置ssl证书即可。配置了ssl证书后,浏览器访问网站服务,就要使用https协议。在这个过程中,浏览器会先获取到网站服务器中的证书信息,然后浏览器本身维护了一个受信任的证书列表。只要网站服务返回的证书在这个受信任的证书列表里面,那么说明这个服务是安全的,浏览器就直接访问到服务了。如果返回的证书没在受信任列表中,那么浏览器认为这个服务是不安全的,就会发出报警信息,不过用户可以手动选择信任此网站,继续访问服务。
由上面的描述可知,使用了ssl证书后,是浏览器为了安全起见,去验证服务器的证书是否信任,信任才能直接访问。大厂的网站的https协议浏览器没有发出报警,是因为大厂都使用了第三方授权的SSL证书,这些证书浏览器默认都是受信任的证书,所以直接就可以访问。但是第三方授权SSL证书一般都要收费才能获取。
而本项目中使用的证书,是自签名证书,浏览器受信任证书列表中没有它,所以就发出报警了。

上述说的是https单项认证,即浏览器认证后台服务证书。也可以开启双向认证,即浏览器认证服务器证书,服务器也认证浏览器证书。但是对于大众网站来说,一般都是单向认证即可。

解决

通过上面的描述可知,想要使自签名证书在浏览器中不报警,那么就要加入到浏览器信任列表中。网上搜了很多nginx生成证书并加入浏览器信任列表的方法,但大部分都不能跳过浏览器的报警。下面记录可以成功跳过浏览器报警的证书生成方式和配置方式。
使用java提供的工具进行生成。
第一步:

keytool -genkeypair -keyalg RSA -dname "CN=Demo" -alias server -keystore server.jks -keypass 123456 -storepass 123456 -ext SAN=dns:域名,ip:后端服务ip

生成server.jks文件。

第二步:

keytool -exportcert -file server.cer -alias server -keystore server.jks -storepass 123456

生成server.cer文件。

第三步:

keytool -importcert -file server.cer -alias server1 -keyalg client_trusk.jks -storepass 123456 -keypass 123456

输出如下:

输入是即可。

第四步:

keytool -importkeystore -srckeystore server.jks -destkeystore server-pkcs12.p12 -deststoretype PKCS12


输入相应的密码即可。生成server-pkcs12.p12文件。

第五步:

openssl x509 -inform der -in server.cer -out server-pem.pem

生成了server-pem.pem文件。

第六步:

openssl pkcs12 -nocerts -nodes -in server-pkcs12.p12 -out server.key

生成server.key文件。

第七步:
将server.key文件和server-pem.pem文件配置到nginx服务的config配置文件中,将server.cer文件安装在浏览器受信任列表中。这样,浏览器访问nginx就可以不再报警,直接访问了。

参考文章:Nginx证书配置:cer文件和jks文件转nginx证书.crt和key文件
(注意:参考文章方式有问题,按照参考文章配置出来的nginx无法让浏览器跳过报警,本博客对该文章进行了优化和纠错)

扩展

在上面的操作中,一共生成了如下几个文件:

而最终,只用到了其中的三个文件。那么这几个文件到底都是干啥的呢?具体可参考关于PEM, DER, CRT, CER,KEY等各类证书与密钥文件后缀的解释一文,这里只做一下简单记录。

在上述步骤中,第一步生成了jks文件,jks文件表示Java 密钥库. 同时包含证书和私钥。

第二步,在第一步生成的jks文件中,导出了cer文件。而cer文件是只包含证书,不保存私钥。一般Linux使用.crt后缀,.cer是windows后缀。因为jks中既包括私钥,也包括证书,所以第二步上讲证书提取出来成了cer文件。而这个cer文件,也是要最后在浏览器中安装到受信任列表的证书文件。

第三步也是对cer证书的一个操作,让这个证书受信任之类的,固定操作,记住即可。

第四步是将第一步生成的jks文件,转换成了p12格式的文件。p12文件是二进制格式,同时包含证书和私钥。可以看出是对jks文件换了一种格式而已,p12还包含证书和私钥。

第五步将cer证书转换成了pem格式。pem文件是使用Base64 ASCII编码后的纯文本文件。不管是证书还是密钥,只要是pem格式,使用文本编辑器打开都是类似的样子,一串冗长的字符串。可以看出,pem只是一种文件格式,证书和私钥,都可以转成pem格式。这里是将证书转成了pem格式。

第六步将p12文件转换成了.key文件,.key文件是私钥,与证书一一配对。即将p12文件中的私钥提取出来了。

第七步就是将.key文件(私钥)和.pem文件(证书)配置到了nginx中,将.cer文件(windows格式证书)配置到了浏览器信任列表中,这样就跳过了浏览器报警。

公钥/私钥/证书三者的区别

在ssl证书中,一会有公钥,一会儿有私钥,一会儿有证书,完全搞蒙蔽了。下面来梳理一下:
首先,私钥是放在服务器中的。如在上面的nginx中,将.key文件(私钥)放在了服务器中。
证书,是配置在服务器中的ssl证书,如nginx中的pem文件就是证书,证书中也有公钥。当浏览器访问ssl协议的网站时,会获取到网站证书,同时也会获取到公钥。然后浏览器拿着获取到的公钥,与网站进行传输,然后到服务器后,服务器通过私钥对数据进行解密。所以https就采用了非对称加密方式保证了数据安全性。

在SpringBoot项目配置https访问单项认证谷歌有效证书一文中,在后台只配置了一个.keystore文件。是因为.keystore文件,既是证书文件,也含有公钥,也含有私钥。

nginx配置https访问 生成ssl自签名证书,浏览器直接访问相关推荐

  1. nginx配置https双向验证(ca机构证书+自签证书)

    nginx配置https双向验证 服务端验证(ca机构证书) 客户端验证(服务器自签证书) 本文用的阿里云签发的免费证书实验,下载nginx安装ssl,文件夹有两个文件 这两个文件用于做服务器http ...

  2. 生成SSL自签名证书

    自签名证书浏览器是不认可的,但学习一下还是很有必要的. 创建SSL证书私钥,期间需要输入两次用户名和密码,证书名称命名为c.key openssl genrsa -des3 -out c.key 20 ...

  3. Nginx支持HTTPS,生成SSL证书

    1.生成证书 # 1. 首先创建SSL证书私钥,期间需要输入两次用户名和密码,生成文件为blog.key: openssl genrsa -des3 -out blog.key 2048# 2. 利用 ...

  4. 【教程】Linux下Https证书生成,与Nginx配置https

    Linux系统Https证书生成与Nginx配置https 证书生成 查看openssl 生成证书 Nginx配置https(默认443端口) 证书生成 查看openssl 1,我们在linux系统下 ...

  5. 1 阿里云Nginx配置https实现域名访问项目

    第一步:签署第三方可信任的 SSL 证书 证书可以直接在阿里云里面申请免费的ssl证书 登录阿里云账号,在上方搜索栏内搜索ssl,点击ssl证书(应用安全) 来到这个页面后点击购买证书 如图选择免费版 ...

  6. linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书

    购买SSL证书 要想使用https访问你的网址,首先得拥有颁发的SSL证书.我使用的是免费版,有效期为一年,过期后再重新申请. 申请SSL证书 购买后,可在搜索框输入证书关键字进入到控制台. 点击证书 ...

  7. Nginx配置https访问

    在这里我使用的是阿里云ECS,里面提供一年免费SSL证书 1.什么是HTTPS 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol ...

  8. 免费生成Nginx的Https使用的SSL证书

    1.打开Free SSL Certificates Provider and ACME Tools 需要先注册 2.选择通配符证书,可以是二级或则三级通配符 例如:*.yourdomain.com 或 ...

  9. nginx配置https阿里云免费ssl

    阿里云搜索ssl 购买证书  创建证书 下载证书 这两个文件放到服务器上,nginx配置指向这两个文件就ok nginx配置 server {listen 443 ssl; #注意服务器防火墙要开放4 ...

最新文章

  1. 最新Maven及Tomcat配置~(IDEA版 试错无数!)
  2. 不用数学讲清马尔可夫链蒙特卡洛方法?
  3. Android Studio-------添加按钮
  4. 步步深入MySQL:架构-gt;查询执行流程-gt;SQL解析顺序!
  5. c语言switch结构计算利润,求助。。关于用switch编写简易计算器
  6. 性能翻倍!斯坦福Matei团队推出机器学习模型优化新方法
  7. 反地理编码 高德地图_由中文地址返回点位坐标-地理编码脚本分享
  8. 如何使用excel快速下载网页图片?
  9. Johnson算法PlantSimulation解决两机器多作业排版问题
  10. Euraka使用入门
  11. 用mui索引实现动态数据仿通讯录的功能
  12. IP代理软件哪个比较好
  13. SNPS IP LPDDR4 调试
  14. 2014年9月CCF软考试题
  15. 3.8编写程序 ,要求用户从键盘输入一个年份,程序输出改年出生的人的生肖。中国生肖基于12年一个周期,Java
  16. 九月英语总结——不同凡响
  17. Altium Designer Pcb 快捷键
  18. SCAU 18709 魔法
  19. Microbiome杂志和主编介绍
  20. matlab fcn模块矩阵例子,16.1 Fcn/Matlab Fcn模块

热门文章

  1. 在VMware上安装macOS
  2. oracle -解锁scott用户
  3. Python入门习题----进制转换
  4. FreeRTOS 任务简介
  5. 深度学习中的BN_CBN_CmBN
  6. mysql 悲观锁实现
  7. 通信管理员(一)居于MAC地址的网络通信
  8. hadoop之hdfs命令
  9. mysql DATE_FORMAT时间格式化
  10. [Axure]QQ注册页面低保真原型