https 单向认证和双向认证配置

HTTPS 是咱们开发中常常用到的通讯加密技术,能有效保护咱们网络访问中的安全,本文主要讲解单向 和 双向 https 的配置。关于https 的实现原理在这里我就不赘述了,附上阮一峰老师的关于https介绍几篇博客,有兴趣的童鞋能够看一看:图解SSL/TLS协议   数字签名是什么?html

本文目录:java

一、单向https配置git

二、双向https配置apache

三、常见名词说明(转载)

windows

 

1.单向https 配置 

  • 生成https证书命令:

    sudo keytool -genkey -keyalg RSA -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn" -alias server -keypass 123456 -keystore server.keystore -storepass 123456 -validity 3650                                        
  • 生成CSR文件 

    本文只是生成自签名的https证书,若是须要申请CA证书,就须要生成CSR文件,并将此文件提交给相应CA机构申请CA证书。
    sudo keytool -certReq -alias server -keystore server.keystore -file ca.csr -storepass 123456
  • 生成CER文件

    由于咱们生成的证书使用keytool生成的,没有通过操做系统可信任的CA机构颁发,因此当用浏览器访问时,会出现不信任证书警告,咱们手工将cer文件(服务端公钥)导入浏览器的证书列表,让其信任。
    sudo keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 123456

  • 在Tomcat中配置Https证书

   在serve.xml 中添加以下配置,便可访问https的站点了。浏览器

<Connector SSLEnabled="true" clientAuth="false"
            keystoreFile="/Users/beiyan/Documents/test/server.keystore"
            keystorePass="123456" maxThreads="150" port="8443"
            protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
            secure="true" sslProtocol="TLS" />

   其中keystoreFile 为证书的地址,keystorePass 为证书的密码。tomcat

        访问界面以下:安全

          

  • 导入CER文件,让浏览器信任此证书

    双击 ca.cer 便可导入,再设置为 始终信任 ,再次访问
  • 应用程序访问

    若是使用HttpClient 等工具访问该Https链接时,须要讲ca.cer 导入jre中;
    命令以下:keytool -import -alias tomcatsso -file "ca.cer" -keystore "/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/security/cacerts" -storepass 123456
    其中 /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre 是jre目录 123456 是jre默认的密码

    2.双向https配置

  • 生成Server端证书:

    sudo keytool -genkey -keyalg RSA -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn" -alias server -keypass 123456 -keystore server.keystore -storepass 123456 -validity 3650
  • 生成客户端证书:

    这里的客户端为浏览器,浏览器支持的证书格式为PKCS12,这里生成PKCS12格式的证书:
    sudo keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -dname "cn=localhost,ou=none,o=none,l=shanghai,st=shanghai,c=cn"  -keypass 123456 -storepass 123456 -keystore client.p12 -validity 3650
  • 让服务端信任客户端的证书

    因为是双向认证,服务端必须验证客户端的身份,因此须要将客户端的公钥导入到服务端的信任列表,可是这里生成的PKCS12文件不能直接导入,因此先导出成CER文件,再将CER文件导入服务端的证书库。
    一、将客户端证书导出为一个单独的CER文件
    sudo keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer

    二、将CER文件导入服务端的证书库
    sudo keytool -import -v -file client.cer -keystore server.keystore

    三、查看server.keystore 里面的证书列表:
    sudo keytool -list -keystore server.keystore

    上图能够看到,证书库中包含两个证书,一个是服务端的私钥,一个是客户端的可信任公钥服务器

  • 让客户端信任服务端证书

    客户端也须要验证服务端的证书是否可靠,因此也须要将服务端证书的公钥导入客户端的信任列表。通用的作法是将服务器证书导出为一个单独的CER文件,而后双击安装到浏览器的证书列表便可。
    sudo keytool -keystore server.keystore -export -alias server -file server.cer -validity 36500
  • 全部生成的证书列表以下:


    client.cer:客户端证书的公钥
    client.p12:客户端证书的私钥
    server.cer:服务端证书的公钥
    server.keystore:服务端证书库,既包含服务端私钥,又包含客户端公钥网络

  • 修改Tomcat 配置:

       在serve.xml 中添加以下配置

  •  

    <Connector SSLEnabled="true" clientAuth="true"
                keystoreFile="/Users/beiyan/Documents/test/keytool/server.keystore"
                truststoreFile="/Users/beiyan/Documents/test/keytool/server.keystore"
                truststorePass="123456" keystorePass="123456" maxThreads="150" port="8443"
                protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
                secure="true" sslProtocol="TLS" />
    clientAuth="true"表示双向认证
  • 客户端安装私钥

    双击client.p12便可安装

    备注(这里是mac下面的设置方式,window 与此相似,双击进入安装界面) 

  • 客户端安装服务端的公钥

    双击server.cer文件,设置同上

  • 成功访问:

       弹出客户端证书选择界面,选择客户端证书,便可正常访问
       
                                              选择证书界面


         

                                       
三、jks,keystore,trustore,cer,pfx等名词说明zhuan(转自网络)

备注:此处转自网络,网络地点太多不肯定源地址

密钥:
公钥+私钥的统称。

密钥对:
公钥(证书)和私钥成对存在。通讯双方各持有本身的私钥和对方的公钥。本身的私钥需密切保护,而公钥是公开给对方的。在windows下,单独存在的公钥通常是后缀为.cer的文件

A用本身的私钥对数据加密,发给B,B用A提供的公钥解密。同理B用本身的私钥对数据加密,发送给A后,A用B的公钥解开。

公钥的两个用途:
1。验证对方身份:防止其余人假冒对方发送数据给你。
2。解密。
私钥的两个用途:
1。代表本身身份:除非第三方有你私钥,不然没法假冒你发送数据数据给对方。
2。加密。

 

jks(Java key store):
Java用的存储密钥的容器。能够同时容纳n个公钥或私钥,后缀通常是.jks或者.keystore或.truststore等,千奇百怪。无论什么后缀,它就是一个容器,各个公司或机构叫法不一样而已。好比把只包含"受信任的公钥"的容器存成.truststore文件等。
用jdk\bin目录下的keytool.exe对其进行查看,导入,导出,删除,修改密码等各类操做。能够对jks容器加密码,输入正确才能够操做此容器中密钥。还有一个密码的概念与上者不一样,是jks中存储着的私钥的密码,一般是绝密的。

 

pfx
和jks功能相同但文件格式不一样,pfx是浏览器用的。
能够用一些工具程序把pfx转化成jks格式供java程序使用(如银行只提供了pfx,可是咱们想用httpclient模拟浏览器自动访问时)。听说IE导出的pfx格式不标准,转化jks时每每报错,能够尝试用Netscape Navigator导入再导出,而后再转化。碰到过这样的状况。

常见的几种https系统的访问。经https协议的数据通过加密传输,防止第三方监听,冒充和篡改。
1.不须要用户作任何操做,好比https://www.verisign.com/
这是由于此公钥是合法的(公钥是可信任的机构颁发,和实际域名吻合,并且没有到期)。用IE访问时空白处点右键能够查看公钥信息。
2.https的页面会弹出公钥确认提示
公钥不合法(不是可信任的机构颁发,和实际域名不吻合,已到期),但用户点“是”即表示忽略危险,继续访问。
3.须要往浏览器倒入一个文件才可访问的
通常是银行在线交易等特别须要安全的场合,站方(银行)须要验证访客身份(如要确认必须是已注册的网银商户),须要在浏览器中导入含有访客私钥的pfx文件。

 

生成jks
在银行没有提供jks文件的状况下对账,须要本身生成jks
对于1,2类https网站,若是java程序访问此地址时在jre默认的信任库中找不到对方证书的颁发机构,则会抛出安全方面的异常。因此要将站方公钥存进一个jks,并在环境变量中设定,代表信任此库中的公钥,才能够正常访问。
我是用现成的make_jks的工具类在程序中读取https://xxxx地址,程序自动抓取出银行公钥并存进一个jks文件。在浏览器中查看站方公钥时,把公钥导出(通常是cer后缀),而后用keytool.exe手工将此cer导入一个jks或许也能够?没试过。以上1,2类https网站,仅仅是用到了公钥的“验证对方身份”功能。对于第3种https网站,也能够找到现成的程序把pfx直接转成jks。既然动用了pfx,通常是把公钥的两个用途和私钥的两个用途都用起来

相关文章
相关标签/搜索