Java加密技术(十)——单向认证

本文详细介绍了如何使用第三方CA机构thawte进行SSL证书的申请和配置过程,包括域名定位、Tomcat配置等步骤。

Java 加密技术(九)中,我们使用自签名证书完成了认证。接下来,我们使用第三方CA签名机构完成证书签名。

这里我们使用 thawte提供的测试用21天免费ca证书。
1.要在该网站上注明你的域名,这里使用 www.zlex.org作为测试用域名( 请勿使用该域名作为你的域名地址,该域名受法律保护!请使用其他非注册域名!)。
2.如果域名有效,你会收到邮件要求你访问 https://www.thawte.com/cgi/server/try.exe获得ca证书。
3.复述密钥库的创建。
Shell代码 收藏代码
  1. keytool-genkey-validity36000-aliaswww.zlex.org-keyalgRSA-keystored:\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. 输入<tomcat>的主密码
  18. (如果和keystore密码相同,按回车):
  19. 再次输入新密码:


4.通过如下命令,从zlex.keystore中导出CA证书申请。
Shell代码 收藏代码
  1. keytool-certreq-aliaswww.zlex.org-filed:\zlex.csr-keystored:\zlex.keystore-v
你会获得zlex.csr文件,可以用记事本打开,内容如下格式:
Text代码 收藏代码
  1. -----BEGINNEWCERTIFICATEREQUEST-----
  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. -----ENDNEWCERTIFICATEREQUEST-----

5.将上述文件内容拷贝到 https://www.thawte.com/cgi/server/try.exe中,点击next,获得回应内容,这里是p7b格式。
内容如下:
Text代码 收藏代码
  1. -----BEGINPKCS7-----
  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. -----ENDPKCS7-----
将其存储为zlex.p7b
6.将由CA签发的证书导入密钥库。
Shell代码 收藏代码
  1. keytool-import-trustcacerts-aliaswww.zlex.org-filed:\zlex.p7b-keystored:\zlex.keystore-v


在这里我使用的密码为 123456

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


7.域名定位
将域名www.zlex.org定位到本机上。打开C:\Windows\System32\drivers\etc\hosts文件,将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. importstaticorg.junit.Assert.*;
  2. importjava.io.DataInputStream;
  3. importjava.io.InputStream;
  4. importjava.net.URL;
  5. importjavax.net.ssl.HttpsURLConnection;
  6. importorg.junit.Test;
  7. /**
  8. *
  9. *@author梁栋
  10. *@version1.0
  11. *@since1.0
  12. */
  13. publicclassCertificateCoderTest{
  14. privateStringpassword="123456";
  15. privateStringalias="www.zlex.org";
  16. privateStringcertificatePath="d:/zlex.cer";
  17. privateStringkeyStorePath="d:/zlex.keystore";
  18. @Test
  19. publicvoidtest()throwsException{
  20. System.err.println("公钥加密——私钥解密");
  21. StringinputStr="Ceritifcate";
  22. byte[]data=inputStr.getBytes();
  23. byte[]encrypt=CertificateCoder.encryptByPublicKey(data,
  24. certificatePath);
  25. byte[]decrypt=CertificateCoder.decryptByPrivateKey(encrypt,
  26. keyStorePath,alias,password);
  27. StringoutputStr=newString(decrypt);
  28. System.err.println("加密前:"+inputStr+"\n\r"+"解密后:"+outputStr);
  29. //验证数据一致
  30. assertArrayEquals(data,decrypt);
  31. //验证证书有效
  32. assertTrue(CertificateCoder.verifyCertificate(certificatePath));
  33. }
  34. @Test
  35. publicvoidtestSign()throwsException{
  36. System.err.println("私钥加密——公钥解密");
  37. StringinputStr="sign";
  38. byte[]data=inputStr.getBytes();
  39. byte[]encodedData=CertificateCoder.encryptByPrivateKey(data,
  40. keyStorePath,alias,password);
  41. byte[]decodedData=CertificateCoder.decryptByPublicKey(encodedData,
  42. certificatePath);
  43. StringoutputStr=newString(decodedData);
  44. System.err.println("加密前:"+inputStr+"\n\r"+"解密后:"+outputStr);
  45. assertEquals(inputStr,outputStr);
  46. System.err.println("私钥签名——公钥验证签名");
  47. //产生签名
  48. Stringsign=CertificateCoder.sign(encodedData,keyStorePath,alias,
  49. password);
  50. System.err.println("签名:\r"+sign);
  51. //验证签名
  52. booleanstatus=CertificateCoder.verify(encodedData,sign,
  53. certificatePath);
  54. System.err.println("状态:\r"+status);
  55. assertTrue(status);
  56. }
  57. @Test
  58. publicvoidtestHttps()throwsException{
  59. URLurl=newURL("https://www.zlex.org/examples/");
  60. HttpsURLConnectionconn=(HttpsURLConnection)url.openConnection();
  61. conn.setDoInput(true);
  62. conn.setDoOutput(true);
  63. CertificateCoder.configSSLSocketFactory(conn,password,keyStorePath,
  64. keyStorePath);
  65. InputStreamis=conn.getInputStream();
  66. intlength=conn.getContentLength();
  67. DataInputStreamdis=newDataInputStream(is);
  68. byte[]data=newbyte[length];
  69. dis.readFully(data);
  70. dis.close();
  71. conn.disconnect();
  72. System.err.println(newString(data));
  73. }
  74. }


再次执行,验证通过!
由此,我们了基于SSL协议的认证过程。测试类的testHttps方法模拟了一次浏览器的HTTPS访问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值