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

xiaoxiao2026-08-07  18

在[b][url=http://snowolf.iteye.com/blog/397693]Java 加密技术(九)[/url][/b]中,我们使用自签名证书完成了认证。接下来,我们使用第三方CA签名机构完成证书签名。 这里我们使用[url=https://www.thawte.com]thawte[/url]提供的测试用21天免费ca证书。 1.要在该网站上注明你的域名,这里使用[b]www.zlex.org[/b]作为测试用域名([color=red]请勿使用该域名作为你的域名地址,该域名受法律保护!请使用其他非注册域名!)。[/color] 2.如果域名有效,你会收到邮件要求你访问[url]https://www.thawte.com/cgi/server/try.exe[/url]获得ca证书。 3.复述密钥库的创建。 keytool -genkey -validity 36000 -alias www.zlex.org -keyalg RSA -keystore d:\zlex.keystore 在这里我使用的密码为 [b]123456[/b] 控制台输出: 输入keystore密码:再次输入新密码:您的名字与姓氏是什么? [Unknown]: www.zlex.org您的组织单位名称是什么? [Unknown]: zlex您的组织名称是什么? [Unknown]: zlex您所在的城市或区域名称是什么? [Unknown]: BJ您所在的州或省份名称是什么? [Unknown]: BJ该单位的两字母国家代码是什么 [Unknown]: CNCN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN 正确吗? [否]: Y输入<tomcat>的主密码 (如果和 keystore 密码相同,按回车):再次输入新密码: 4.通过如下命令,从zlex.keystore中导出CA证书申请。 keytool -certreq -alias www.zlex.org -file d:\zlex.csr -keystore d:\zlex.keystore -v你会获得zlex.csr文件,可以用记事本打开,内容如下格式: -----BEGIN NEW CERTIFICATE REQUEST-----MIIBnDCCAQUCAQAwXDELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAkJKMQswCQYDVQQHEwJCSjENMAsGA1UEChMEemxleDENMAsGA1UECxMEemxleDEVMBMGA1UEAxMMd3d3LnpsZXgub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCR6DXU9Mp+mCKO7cv9JPsj0n1Ec/GpM09qvhpgX3FNad/ZWSDcvU77YXZSoF9hQp3w1LC+eeKgd2MlVpXTvbVwBNVd2HiQPp37ic6BUUjSaX8LHtCl7l0BIEye9qQ2j8G0kak7e8ZA0s7nb3Ymq/K8BV7v0MQIdhIc1bifK9ZDewIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAMA1r2fbZPtNx37U9TRwadCH2TZZecwKJS/hskNm6ryPKIAp9APWwAyj8WJHRBz5SpZM4zmYOoMCI8BcnY2A4JP+R7/SwXTdH/xcg7NVghd9A2SCgqMpF7KMfc5dE3iygdiPu+UhY200Dvpjx8gmJ1UbH3+nqMUyCrZgURFslOUY=-----END NEW CERTIFICATE REQUEST----- 5.将上述文件内容拷贝到[url]https://www.thawte.com/cgi/server/try.exe[/url]中,点击next,获得回应内容,这里是p7b格式。 内容如下: -----BEGIN PKCS7-----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-----END PKCS7-----将其存储为zlex.p7b 6.将由CA签发的证书导入密钥库。 keytool -import -trustcacerts -alias www.zlex.org -file d:\zlex.p7b -keystore d:\zlex.keystore -v 在这里我使用的密码为 [b]123456[/b] 控制台输出: 输入keystore密码:回复中的最高级认证:所有者:CN=Thawte Test CA Root, OU=TEST TEST TEST, O=Thawte Certification, ST=FOR TESTING PURPOSES ONLY, C=ZA签发人:CN=Thawte Test CA Root, OU=TEST TEST TEST, O=Thawte Certification, ST=FOR TESTING PURPOSES ONLY, C=ZA序列号:0有效期: Thu Aug 01 08:00:00 CST 1996 至Fri Jan 01 05:59:59 CST 2021证书指纹: MD5:5E:E0:0E:1D:17:B7:CA:A5:7D:36:D6:02:DF:4D:26:A4 SHA1:39:C6:9D:27:AF:DC:EB:47:D6:33:36:6A:B2:05:F1:47:A9:B4:DA:EA 签名算法名称:MD5withRSA 版本: 3扩展:#1: ObjectId: 2.5.29.19 Criticality=trueBasicConstraints:[ CA:true PathLen:2147483647]... 是不可信的。 还是要安装回复? [否]: Y认证回复已安装在 keystore中[正在存储 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 <Connector keystoreFile="conf/zlex.keystore" keystorePass="123456" truststoreFile="conf/zlex.keystore" truststorePass="123456" SSLEnabled="true" URIEncoding="UTF-8" clientAuth="false" maxThreads="150" port="443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" /> 将文件[b]zlex.keystore[/b]拷贝到tomcat的[b]conf[/b]目录下,重新启动tomcat。访问[url]https://www.zlex.org/[/url],我们发现联网有些迟钝。大约5秒钟后,网页正常显示,同时有如下图所示: [img]/upload/attachment/109146/ba0a327e-afd9-35ed-8836-8ec92b72e8cf.jpg[/img] 浏览器验证了该CA机构的有效性。 打开证书,如下图所示: [img]/upload/attachment/109433/dfa22608-e0fc-303e-84c1-c6622c95843a.jpg[/img] 调整测试类: import static org.junit.Assert.*;import java.io.DataInputStream;import java.io.InputStream;import java.net.URL;import javax.net.ssl.HttpsURLConnection;import org.junit.Test;/** * * @author 梁栋 * @version 1.0 * @since 1.0 */public class CertificateCoderTest { private String password = "123456"; private String alias = "www.zlex.org"; private String certificatePath = "d:/zlex.cer"; private String keyStorePath = "d:/zlex.keystore"; @Test public void test() throws Exception { System.err.println("公钥加密——私钥解密"); String inputStr = "Ceritifcate"; byte[] data = inputStr.getBytes(); byte[] encrypt = CertificateCoder.encryptByPublicKey(data, certificatePath); byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, password); String outputStr = new String(decrypt); System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); // 验证数据一致 assertArrayEquals(data, decrypt); // 验证证书有效 assertTrue(CertificateCoder.verifyCertificate(certificatePath)); } @Test public void testSign() throws Exception { System.err.println("私钥加密——公钥解密"); String inputStr = "sign"; byte[] data = inputStr.getBytes(); byte[] encodedData = CertificateCoder.encryptByPrivateKey(data, keyStorePath, alias, password); byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData, certificatePath); String outputStr = new String(decodedData); System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); assertEquals(inputStr, outputStr); System.err.println("私钥签名——公钥验证签名"); // 产生签名 String sign = CertificateCoder.sign(encodedData, keyStorePath, alias, password); System.err.println("签名:\r" + sign); // 验证签名 boolean status = CertificateCoder.verify(encodedData, sign, certificatePath); System.err.println("状态:\r" + status); assertTrue(status); } @Test public void testHttps() throws Exception { URL url = new URL("https://www.zlex.org/examples/"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); CertificateCoder.configSSLSocketFactory(conn, password, keyStorePath, keyStorePath); InputStream is = conn.getInputStream(); int length = conn.getContentLength(); DataInputStream dis = new DataInputStream(is); byte[] data = new byte[length]; dis.readFully(data); dis.close(); conn.disconnect(); System.err.println(new String(data)); }} 再次执行,验证通过! :D 由此,我们了基于SSL协议的认证过程。测试类的testHttps方法模拟了一次浏览器的HTTPS访问。 :D [b] 相关链接: [url=http://snowolf.iteye.com/blog/379860]Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC[/url] [url=http://snowolf.iteye.com/blog/380034]Java加密技术(二)——对称加密DES&AES[/url] [url=http://snowolf.iteye.com/blog/380761]Java加密技术(三)——PBE算法[/url] [url=http://snowolf.iteye.com/blog/381767]Java加密技术(四)——非对称加密算法RSA[/url] [url=http://snowolf.iteye.com/blog/382422]Java加密技术(五)——非对称加密算法的由来[/url] [url=http://snowolf.iteye.com/blog/382749]Java加密技术(六)——数字签名算法DSA[/url] [url=http://snowolf.iteye.com/blog/383412]Java加密技术(七)——非对称加密算法最高ECC[/url] [url=http://snowolf.iteye.com/blog/391931]Java加密技术(八)——数字证书[/url] [url=http://snowolf.iteye.com/blog/397693]Java加密技术(九)——初探SSL[/url] [url=http://snowolf.iteye.com/blog/398198]Java加密技术(十)——单向认证[/url] [url=http://snowolf.iteye.com/blog/510985]Java加密技术(十一)——双向认证[/url] [url=http://snowolf.iteye.com/blog/735294]Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件[/url] [/b] 相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-5050838.html

最新回复(0)