zoukankan      html  css  js  c++  java
  • 单向认证

      在Java 加密技术(九)中,我们使用自签名证书完成了认证。接下来,我们使用第三方CA签名机构完成证书签名。
        这里我们使用thawte提供的测试用21天免费ca证书。
        1.要在该网站上注明你的域名,这里使用www.zlex.org作为测试用域名(请勿使用该域名作为你的域名地址,该域名受法律保护!请使用其他非注册域名!)。
        2.如果域名有效,你会收到邮件要求你访问https://www.thawte.com/cgi/server/try.exe获得ca证书。
        3.复述密钥库的创建。
       

    Shell代码  收藏代码
    1. keytool -genkey -validity 36000 -alias www.zlex.org -keyalg RSA -keystore d:zlex.keystore  



    在这里我使用的密码为 123456

    控制台输出:

    Console代码  收藏代码
    1. 输入keystore密码:  
    2. 再次输入新密码:  
    3. 您的名字与姓氏是什么?  
    4.   [Unknown]:  www.zlex.org  
    5. 您的组织单位名称是什么?  
    6.   [Unknown]:  zlex  
    7. 您的组织名称是什么?  
    8.   [Unknown]:  zlex  
    9. 您所在的城市或区域名称是什么?  
    10.   [Unknown]:  BJ  
    11. 您所在的州或省份名称是什么?  
    12.   [Unknown]:  BJ  
    13. 该单位的两字母国家代码是什么  
    14.   [Unknown]:  CN  
    15. CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN 正确吗?  
    16.   [否]:  Y  
    17.   
    18. 输入<tomcat>的主密码  
    19.         (如果和 keystore 密码相同,按回车):  
    20. 再次输入新密码:  



        4.通过如下命令,从zlex.keystore中导出CA证书申请。
       

    Shell代码  收藏代码
    1. keytool -certreq -alias www.zlex.org -file d:zlex.csr -keystore d:zlex.keystore -v  

    你会获得zlex.csr文件,可以用记事本打开,内容如下格式:

    Text代码  收藏代码
    1. -----BEGIN NEW CERTIFICATE REQUEST-----  
    2. MIIBnDCCAQUCAQAwXDELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAkJKMQswCQYDVQQHEwJCSjENMAsG  
    3. A1UEChMEemxleDENMAsGA1UECxMEemxleDEVMBMGA1UEAxMMd3d3LnpsZXgub3JnMIGfMA0GCSqG  
    4. SIb3DQEBAQUAA4GNADCBiQKBgQCR6DXU9Mp+mCKO7cv9JPsj0n1Ec/GpM09qvhpgX3FNad/ZWSDc  
    5. vU77YXZSoF9hQp3w1LC+eeKgd2MlVpXTvbVwBNVd2HiQPp37ic6BUUjSaX8LHtCl7l0BIEye9qQ2  
    6. j8G0kak7e8ZA0s7nb3Ymq/K8BV7v0MQIdhIc1bifK9ZDewIDAQABoAAwDQYJKoZIhvcNAQEFBQAD  
    7. gYEAMA1r2fbZPtNx37U9TRwadCH2TZZecwKJS/hskNm6ryPKIAp9APWwAyj8WJHRBz5SpZM4zmYO  
    8. oMCI8BcnY2A4JP+R7/SwXTdH/xcg7NVghd9A2SCgqMpF7KMfc5dE3iygdiPu+UhY200Dvpjx8gmJ  
    9. 1UbH3+nqMUyCrZgURFslOUY=  
    10. -----END NEW CERTIFICATE REQUEST-----  


        5.将上述文件内容拷贝到https://www.thawte.com/cgi/server/try.exe中,点击next,获得回应内容,这里是p7b格式。
    内容如下:

    Text代码  收藏代码
    1. -----BEGIN PKCS7-----  
    2. MIIF3AYJKoZIhvcNAQcCoIIFzTCCBckCAQExADALBgkqhkiG9w0BBwGgggWxMIID  
    3. EDCCAnmgAwIBAgIQA/mx/pKoaB+KGX2hveFU9zANBgkqhkiG9w0BAQUFADCBhzEL  
    4. MAkGA1UEBhMCWkExIjAgBgNVBAgTGUZPUiBURVNUSU5HIFBVUlBPU0VTIE9OTFkx  
    5. HTAbBgNVBAoTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9uMRcwFQYDVQQLEw5URVNUIFRF  
    6. U1QgVEVTVDEcMBoGA1UEAxMTVGhhd3RlIFRlc3QgQ0EgUm9vdDAeFw0wOTA1Mjgw  
    7. MDIxMzlaFw0wOTA2MTgwMDIxMzlaMFwxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJC  
    8. SjELMAkGA1UEBxMCQkoxDTALBgNVBAoTBHpsZXgxDTALBgNVBAsTBHpsZXgxFTAT  
    9. BgNVBAMTDHd3dy56bGV4Lm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA  
    10. keg11PTKfpgiju3L/ST7I9J9RHPxqTNPar4aYF9xTWnf2Vkg3L1O+2F2UqBfYUKd  
    11. 8NSwvnnioHdjJVaV0721cATVXdh4kD6d+4nOgVFI0ml/Cx7Qpe5dASBMnvakNo/B  
    12. tJGpO3vGQNLO5292JqvyvAVe79DECHYSHNW4nyvWQ3sCAwEAAaOBpjCBozAMBgNV  
    13. HRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBABgNVHR8E  
    14. OTA3MDWgM6Axhi9odHRwOi8vY3JsLnRoYXd0ZS5jb20vVGhhd3RlUHJlbWl1bVNl  
    15. cnZlckNBLmNybDAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9v  
    16. Y3NwLnRoYXd0ZS5jb20wDQYJKoZIhvcNAQEFBQADgYEATPuxZbtJJSPmXvfrr1yz  
    17. xqM06IwTZ6UU0lZRG7I0WufMjNMKdpn8hklUhE17mxAhGSpewLVVeLR7uzBLFkuC  
    18. X7wMXxhoYdJZtNai72izU6Rd1oknao7diahvRxPK4IuQ7y2oZ511/4T4vgY6iRAj  
    19. q4q76HhPJrVRL/sduaiu+gYwggKZMIICAqADAgECAgEAMA0GCSqGSIb3DQEBBAUA  
    20. MIGHMQswCQYDVQQGEwJaQTEiMCAGA1UECBMZRk9SIFRFU1RJTkcgUFVSUE9TRVMg  
    21. T05MWTEdMBsGA1UEChMUVGhhd3RlIENlcnRpZmljYXRpb24xFzAVBgNVBAsTDlRF  
    22. U1QgVEVTVCBURVNUMRwwGgYDVQQDExNUaGF3dGUgVGVzdCBDQSBSb290MB4XDTk2  
    23. MDgwMTAwMDAwMFoXDTIwMTIzMTIxNTk1OVowgYcxCzAJBgNVBAYTAlpBMSIwIAYD  
    24. VQQIExlGT1IgVEVTVElORyBQVVJQT1NFUyBPTkxZMR0wGwYDVQQKExRUaGF3dGUg  
    25. Q2VydGlmaWNhdGlvbjEXMBUGA1UECxMOVEVTVCBURVNUIFRFU1QxHDAaBgNVBAMT  
    26. E1RoYXd0ZSBUZXN0IENBIFJvb3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB  
    27. ALV9kG+Os6x/DOhm+tKUQfzVMWGhE95sFmEtkMMTX2Zi4n6i6BvzoReJ5njzt1LF  
    28. cqu4EUk9Ji20egKKfmqRzmQFLP7+1niSdfJEUE7cKY40QoI99270PTrLjJeaMcCl  
    29. +AYl+kD+RL5BtuKKU3PurYcsCsre6aTvjMcqpTJOGeSPAgMBAAGjEzARMA8GA1Ud  
    30. EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAgozj7BkD9O8si2V0v+EZ/t7E  
    31. fz/LC8y6mD7IBUziHy5/53ymGAGLtyhXHvX+UIE6UWbHro3IqVkrmY5uC93Z2Wew  
    32. A/6edK3KFUcUikrLeewM7gmqsiASEKx2mKRKlu12jXyNS5tXrPWRDvUKtFC1uL9a  
    33. 12rFAQS2BkIk7aU+ghYxAA==  
    34. -----END PKCS7-----  

    将其存储为zlex.p7b
        6.将由CA签发的证书导入密钥库。
       

    Shell代码  收藏代码
    1. keytool -import -trustcacerts -alias www.zlex.org -file d:zlex.p7b -keystore d:zlex.keystore -v  



    在这里我使用的密码为 123456

        控制台输出:

    Console代码  收藏代码
    1. 输入keystore密码:  
    2.   
    3. 回复中的最高级认证:  
    4.   
    5. 所有者:CN=Thawte Test CA Root, OU=TEST TEST TEST, O=Thawte Certification, ST=FOR  
    6.  TESTING PURPOSES ONLY, C=ZA  
    7. 签发人:CN=Thawte Test CA Root, OU=TEST TEST TEST, O=Thawte Certification, ST=FOR  
    8.  TESTING PURPOSES ONLY, C=ZA  
    9. 序列号:0  
    10. 有效期: Thu Aug 01 08:00:00 CST 1996 至Fri Jan 01 05:59:59 CST 2021  
    11. 证书指纹:  
    12.          MD5:5E:E0:0E:1D:17:B7:CA:A5:7D:36:D6:02:DF:4D:26:A4  
    13.          SHA1:39:C6:9D:27:AF:DC:EB:47:D6:33:36:6A:B2:05:F1:47:A9:B4:DA:EA  
    14.          签名算法名称:MD5withRSA  
    15.          版本: 3  
    16.   
    17. 扩展:  
    18.   
    19. #1: ObjectId: 2.5.29.19 Criticality=true  
    20. BasicConstraints:[  
    21.   CA:true  
    22.   PathLen:2147483647  
    23. ]  
    24.   
    25.   
    26. ... 是不可信的。 还是要安装回复? [否]:  Y  
    27. 认证回复已安装在 keystore中  
    28. [正在存储 d:zlex.keystore]  



        7.域名定位
        将域名www.zlex.org定位到本机上。打开C:WindowsSystem32driversetchosts文件,将www.zlex.org绑定在本机上。在文件末尾追加127.0.0.1       www.zlex.org。现在通过地址栏访问http://www.zlex.org,或者通过ping命令,如果能够定位到本机,域名映射就搞定了。

        8.配置server.xml

    Xml代码  收藏代码
    1. <Connector  
    2.     keystoreFile="conf/zlex.keystore"  
    3.     keystorePass="123456"   
    4.     truststoreFile="conf/zlex.keystore"      
    5.     truststorePass="123456"       
    6.     SSLEnabled="true"  
    7.     URIEncoding="UTF-8"  
    8.     clientAuth="false"            
    9.     maxThreads="150"  
    10.     port="443"  
    11.     protocol="HTTP/1.1"  
    12.     scheme="https"  
    13.     secure="true"  
    14.     sslProtocol="TLS" />  



    将文件zlex.keystore拷贝到tomcat的conf目录下,重新启动tomcat。访问https://www.zlex.org/,我们发现联网有些迟钝。大约5秒钟后,网页正常显示,同时有如下图所示:

    浏览器验证了该CA机构的有效性。

    打开证书,如下图所示:


    调整测试类:

    Java代码  收藏代码
    1. import static org.junit.Assert.*;  
    2.   
    3. import java.io.DataInputStream;  
    4. import java.io.InputStream;  
    5. import java.net.URL;  
    6.   
    7. import javax.net.ssl.HttpsURLConnection;  
    8.   
    9. import org.junit.Test;  
    10.   
    11. /** 
    12.  *  
    13.  * @author 梁栋 
    14.  * @version 1.0 
    15.  * @since 1.0 
    16.  */  
    17. public class CertificateCoderTest {  
    18.     private String password = "123456";  
    19.     private String alias = "www.zlex.org";  
    20.     private String certificatePath = "d:/zlex.cer";  
    21.     private String keyStorePath = "d:/zlex.keystore";  
    22.   
    23.     @Test  
    24.     public void test() throws Exception {  
    25.         System.err.println("公钥加密——私钥解密");  
    26.         String inputStr = "Ceritifcate";  
    27.         byte[] data = inputStr.getBytes();  
    28.   
    29.         byte[] encrypt = CertificateCoder.encryptByPublicKey(data,  
    30.                 certificatePath);  
    31.   
    32.         byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt,  
    33.                 keyStorePath, alias, password);  
    34.         String outputStr = new String(decrypt);  
    35.   
    36.         System.err.println("加密前: " + inputStr + " " + "解密后: " + outputStr);  
    37.   
    38.         // 验证数据一致  
    39.         assertArrayEquals(data, decrypt);  
    40.   
    41.         // 验证证书有效  
    42.         assertTrue(CertificateCoder.verifyCertificate(certificatePath));  
    43.   
    44.     }  
    45.   
    46.     @Test  
    47.     public void testSign() throws Exception {  
    48.         System.err.println("私钥加密——公钥解密");  
    49.   
    50.         String inputStr = "sign";  
    51.         byte[] data = inputStr.getBytes();  
    52.   
    53.         byte[] encodedData = CertificateCoder.encryptByPrivateKey(data,  
    54.                 keyStorePath, alias, password);  
    55.   
    56.         byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData,  
    57.                 certificatePath);  
    58.   
    59.         String outputStr = new String(decodedData);  
    60.         System.err.println("加密前: " + inputStr + " " + "解密后: " + outputStr);  
    61.         assertEquals(inputStr, outputStr);  
    62.   
    63.         System.err.println("私钥签名——公钥验证签名");  
    64.         // 产生签名  
    65.         String sign = CertificateCoder.sign(encodedData, keyStorePath, alias,  
    66.                 password);  
    67.         System.err.println("签名: " + sign);  
    68.   
    69.         // 验证签名  
    70.         boolean status = CertificateCoder.verify(encodedData, sign,  
    71.                 certificatePath);  
    72.         System.err.println("状态: " + status);  
    73.         assertTrue(status);  
    74.   
    75.     }  
    76.   
    77.     @Test  
    78.     public void testHttps() throws Exception {  
    79.         URL url = new URL("https://www.zlex.org/examples/");  
    80.         HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();  
    81.   
    82.         conn.setDoInput(true);  
    83.         conn.setDoOutput(true);  
    84.   
    85.         CertificateCoder.configSSLSocketFactory(conn, password, keyStorePath,  
    86.                 keyStorePath);  
    87.   
    88.         InputStream is = conn.getInputStream();  
    89.   
    90.         int length = conn.getContentLength();  
    91.   
    92.         DataInputStream dis = new DataInputStream(is);  
    93.         byte[] data = new byte[length];  
    94.         dis.readFully(data);  
    95.   
    96.         dis.close();  
    97.         conn.disconnect();  
    98.         System.err.println(new String(data));  
    99.     }  
    100. }  



    再次执行,验证通过!
    由此,我们了基于SSL协议的认证过程。测试类的testHttps方法模拟了一次浏览器的HTTPS访问。

  • 相关阅读:
    jsp表单数据添加到数据库
    javaweb 复习随笔
    [组 原]
    [组 原]
    均方差、交叉熵及公式推导
    网络安全知识网站
    docker搭建渗透环境并进行渗透测试
    SQL注入之-DECLARE时间盲注
    Apache Flink Dashboard未授权访问导致任意Jar包上传漏洞
    Dnscat2实现DNS隐蔽隧道反弹Shell
  • 原文地址:https://www.cnblogs.com/kabi/p/6232951.html
Copyright © 2011-2022 走看看