SSL 证书链及 Web 服务器配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL 证书链及 Web 服务器配置相关的知识,希望对你有一定的参考价值。

参考技术A 有两种类型的证书颁发机构(CA):根 CA 和中间 CA。如果想让一个设备信任一个证书,必须保证该证书设备信任的 CA 颁发。
  如果证书不是由受信任的 CA 签发的,则连接设备(例如,网页浏览器)将检查发行 CA 的证书是否由可信 CA 颁发,等等,直到找到可信 CA 为止 (此时将建立可信的安全连接),或者找不到可信的 CA(此时设备通常会显示错误)。

SSL 证书列表(从根证书到最终用户证书)代表 SSL 证书链。

这是一个实际的例子。 假设您从 Awesome Authority 购买域 example.awesome 的证书。

Awesome Authority 不是根证书颁发机构。 换句话说,它的证书并不直接嵌入到您的 Web 浏览器中,因此它不能被明确信任。

在我们的示例中,SSL 证书链由 6 个证书表示:

证书 1 是您的最终用户证书,即您从 CA 购买的证书。 从 2 到 5 的证书称为中间证书。 证书 6,即位于链条顶部的链接称为根证书。

当您为 example.awesome 安装最终用户证书时,必须捆绑所有中间证书并将它们与最终用户证书一起安装。 如果SSL证书链无效或损坏,则某些设备不会信任您的证书。

不用。根证书通常嵌入您的连接设备中。 在 Web 浏览器的情况下,根证书与浏览器软件一起打包。

安装中级 SSL 证书的过程取决于 Web 服务器和安装证书的环境。

例如,Apache 要求您捆绑中间 SSL 证书,并将该包的位置指定给 SSLCertificateChainFile 配置项。 而 nginx 要求您将中间 SSL 证书与最终用户证书打包在一个包中。

我们提供一个证书安装向导,其中包含多个服务器和平台的安装说明。 如果您向我们购买证书,您将能够 使用此向导获取并安装服务器所需的文件 。

如果您的服务器不在向导中,您仍然可以通过它获取正确的文件,然后按照 Web 服务器的文档来确定如何正确安装域证书和中间证书。

如果您未安装一个或多个中级 SSL 证书,则会破坏证书链。 这意味着您在特定(最终用户或中间)证书与其颁发者之间建立了缝隙。 当设备找不到证书的受信任颁发者时,证书和从中间证书直到最终证书的整个链都不可信。

因此,您的最终证书不会被信任。 Web浏览器将显示“无效证书”或“证书不可信”错误。

这不可能。 缩短链条的唯一方法是将中间证书提升为根。 理想情况下,您应该推广代表您的证书颁发机构的证书,这样该链只包含两个证书。

但是,根证书与浏览器软件一起打包,如果不是来自浏览器维护人员,则不能更改该列表。

某些浏览器可能会抱怨由非知名证书颁发机构签署的证书,而其他浏览器可能会接受证书而没有问题。 发生这种情况的原因,是颁发机构使用中间证书对服务器证书进行了签名,该中间证书不在与特定浏览器一起分发的知名的的受信任证书颁发机构的证书库中。 在这种情况下,权威机构提供一系列链接的证书,这些证书应连接到已签署的服务器证书。 服务器证书必须出现在组合文件中的链接证书之前:

生成的文件应该在 ssl_certificate 指令中使用:

如果服务器证书和软件包已按照错误顺序连接,Nginx 将无法启动并显示错误消息:

因为 Nginx 已经尝试将私钥与该包的第一个证书一起使用,而不是服务器证书。

浏览器通常存储他们收到的中间证书并由受信任的机构签名,因此主动使用的浏览器可能已经具有所需的中间证书,并且可能不会抱怨没有链接包发送的证书。 为确保服务器发送完整的证书链,可以使用 openssl 命令行实用程序,例如:

(完)

JDK自带工具keytool生成ssl证书(web服务https配置)

https://www.cnblogs.com/zhangzb/p/5200418.html

前言:

因为公司项目客户要求使用HTTPS的方式来保证数据的安全,所以木有办法研究了下怎么生成ssl证书来使用https以保证数据安全。

百度了不少资料,看到JAVA的JDK自带生成SSL证书的工具:keytool,外加看了同事的心得体会,自己总结了一下具体的使用方法和使用过程中发现的问题及解决办法。

 

1:什么是HTTPS?

HTTPS其实是有两部分组成:HTTP + SSL / TLS,

也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证。

问题:

Firebug和postman之类的浏览器调试工具,为什么获取到的是明文?

解答:

SSL是对传输的数据进行加密,针对的是传输过程的安全。 

firebug之类的浏览器调试工具,

因为他们得到的是客户端加密之前/解密之后的数据,因此是明文的。

2:什么是自签名证书?

就是自己生成的证书,并不是官方生成的证书。

除非是很正式的项目,否则使用自己签发的证书即可,因为官方生成证书是要花钱滴。

 

3:进入正题,使用JDK自带工具KeyTool 生成自签发证书!

第一步:为服务器生成证书

打开CMD命令行工具,cd到C盘根目录或者是jdk的bin目录下,如下图所示:

使用keytool命令生成证书:

keytool 

-genkey 

-alias tomcat(别名) 

-keypass 123456(别名密码) 

-keyalg RSA(算法) 

-keysize 1024(密钥长度) 

-validity 365(有效期,天单位) 

-keystore D:/keys/tomcat.keystore(指定生成证书的位置和证书名称) 

-storepass 123456(获取keystore信息的密码)

 

方便复制版:

keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/keys/tomcat.keystore -storepass 123456

图例:

 

回车执行后如下图:

 

点击回车即可在D:/keys/文件夹内生成名为:tomcat.keystore的文件。

成功后无提示信息

注意:

①D:/keys/ 目录需要提前手动创建好,否则会生成失败

②提示输入域名的时候不能输入IP地址

 

问题①的错误信息如下:

 

 

 

第二步:为客户端生成证书

为浏览器生成证书,以便让服务器来验证它。

为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,

因此,使用如下命令生成:

keytool 

-genkey 

-alias client 

-keypass 123456

-keyalg RSA 

-storetype PKCS12 

-keypass 123456 

-storepass 123456 

-keystore D:/keys/client.p12

 

方便复制版:

keytool -genkey -alias client1 -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore D:/keys/client1.p12 -storepass 123456

图例:

 

第二步余下操作步骤同第一步。

 

第三步:让服务器信任客户端证书

1、

由于不能直接将PKCS12格式的证书库导入,

必须先把客户端证书导出为一个单独的CER文件,使用如下命令:

keytool -export -alias client -keystore D:/keys/client.p12 -storetype PKCS12 -keypass 123456 -file D:/keys/client.cer

注意:

Keypass:指定CER文件的密码,但会被忽略,而要求重新输入

2、

将该文件导入到服务器的证书库,添加为一个信任证书:

keytool -import -v -file D:/keys/client.cer -keystore D:/keys/tomcat.keystor

e -storepass 123456

图例:

 

完成之后通过list命令查看服务器的证书库,

可以看到两个证书,一个是服务器证书,一个是受信任的客户端证书:

keytool -list -v -keystore D:/keys/tomcat.keystore

 

第四步:让客户端信任服务器证书

1、

由于是双向SSL认证,客户端也要验证服务器证书,

因此,必须把服务器证书添加到浏览器的“受信任的根证书颁发机构”。

由于不能直接将keystore格式的证书库导入,

必须先把服务器证书导出为一个单独的CER文件,使用如下命令:

keytool -keystore D:/keys/tomcat.keystore -export -alias tomcat6 -file D:/keys/server.cer

2、

双击server.cer文件,按照提示安装证书,

将证书填入到“受信任的根证书颁发机构”。

填入方法:

打开浏览器   - 工具  -  internet选项-内容- 证书-把中级证书颁发机构里的www.localhost.com(该名称即时你前面生成证书时填写的名字与姓氏)证书导出来-再把导出来的证书导入  受信任的根颁发机构  就OK了。

 

第五步:配置Tomcat服务器

<Connector  port="8443"

protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"

maxThreads="150"

scheme="https"

secure="true"

clientAuth="true"

sslProtocol="TLS"

keystoreFile="D:/keys/tomcat.keystore"

keystorePass="123456"

truststoreFile="D:/keys/tomcat.keystore"

truststorePass="123456" />

 

属性说明:

clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证

keystoreFile:服务器证书文件路径

keystorePass:服务器证书密码

truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书

truststorePass:根证书密码

 

注意:

① 设置clientAuth属性为True时,需要手动导入客户端证书才能访问。

② 要访问https请求 需要访问8443端口,访问http请求则访问Tomcat默认端口(你自己设置的端口,默认8080)即可。

 

 

总结:

经过以上五步,你使用HTTPS 端口为8443 进行访问的时候 就是经过SSL信息加密,不怕被截获了。

通话的双方,必须是都拥有证书的端,才能进行会话,换句话说,就是只有安装了咱证书的客户端,才能与服务器通信。

 

小贴士:

强制 https 访问

在 tomcat /conf/web.xml 中的 </welcome- file-list> 后面加上这

  1. <login-config>    
  2. <!-- Authorization setting for SSL -->    
  3. <auth-method>CLIENT-CERT</auth-method>    
  4. <realm-name>Client Cert Users-only Area</realm-name>    
  5. </login-config>    
  6. <security-constraint>    
  7. <!-- Authorization setting for SSL -->    
  8. <web-resource-collection >    
  9. <web-resource-name >SSL</web-resource-name>    
  10. <url-pattern>/*</url-pattern>    
  11. </web-resource-collection>    
  12. <user-data-constraint>    
  13. <transport-guarantee>CONFIDENTIAL</transport-guarantee>    
  14. </user-data-constraint>    
  15. </security-constraint> 

 

完成以上步骤后,在浏览器中输入http的访问地址也会自动转换为https了。

 

 

 

 

 

 

 

 

 

 

 

 

 

附录1:

keytool常用命令 

-alias       产生别名 

-keystore    指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的, 

             你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个) 

-storepass   指定密钥库的密码 

-keypass     指定别名条目的密码 

-list        显示密钥库中的证书信息 

-v           显示密钥库中的证书详细信息 

-export      将别名指定的证书导出到文件 

-file        参数指定导出到文件的文件名 

-delete      删除密钥库中某条目 

-import      将已签名数字证书导入密钥库 

-keypasswd   修改密钥库中指定条目口令 

-dname       指定证书拥有者信息 

-keyalg      指定密钥的算法 

-validity    指定创建的证书有效期多少天 

-keysize     指定密钥长度 

 

使用说明: 

导入一个证书命令可以如下: 

keytool -import -keystore cacerts -storepass 666666 -keypass 888888 -alias alibabacert -file C:\\alibabajava\\cert\\test_root.cer 

其中-keystore cacerts中的cacerts是jre中默认的证书库名字,也可以使用其它名字 

-storepass 666666中的666666是这个证书库的密码 

-keypass 888888中的888888是这个特定证书的密码 

-alias alibabacert中的alibabacert是你导入证书的别名,在其它操作命令中就可以使用它 

-file C:\\alibabajava\\cert\\test_root.cer中的文件路径就是要导入证书的路径 

 

浏览证书库里面的证书信息,可以使用如下命令: 

keytool -list -v -alias alibabacert -keystore cacerts -storepass 666666 

 

要删除证书库里面的某个证书,可以使用如下命令: 

keytool -delete -alias alibabacert -keystore cacerts -storepass 666666 

 

要导出证书库里面的某个证书,可以使用如下命令: 

keytool -export -keystore cacerts -storepass 666666 -alias alibabacert -file F:\\alibabacert_root.cer 

 

要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效) 

这个是交互式的,在输入命令后,会要求你输入密码 

keytool -keypasswd -alias alibabacert -keystore cacerts 

这个不是交互式的,输入命令后直接更改 

Keytool -keypasswd -alias alibabacert -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts


以上是关于SSL 证书链及 Web 服务器配置的主要内容,如果未能解决你的问题,请参考以下文章

利用CA证书配置安全Web站点

JDK自带工具keytool生成ssl证书(web服务https配置)

阿里云ECS云服务器怎么安装配置SSL证书

nginx配置ssl证书

阿里云ECS云服务器怎么安装配置SSL证书

用于使用 SOAP Web 服务的 CXF SSL 配置