广州web培训
达内广州五羊中心

18589266248

热门课程

HTTPS和Java如何融合?

  • 时间:2016-11-08 14:17
  • 发布:广州web培训
  • 来源:开源中国

HTTPS和Java如何融合?

我们需要一个密钥的keysotre文件,里面有客户端的证书以及用于融合认证的客户端私钥。

首选,我们的创建受信任的keystore文件。我们使用keytool命令来创建带有证书的keystore文件:

1 $ keytool -import -alias trusted_certificate -keystore trusted.jks -file trusted.crt

我们在keystore文件中将trusted.jks以及 证书trusted.crt存储在trusted_certificate别名下。 在命令的执行过程中,会要求我们输入这个keystore文件的密码,稍后我们会使用这个密码来访问这个keystore文件。

要创建一个keystore,还需要几个额外的步骤。达内广州web培训认为在大多数情况下,你可能会要从公司收到两个从客户端证书发出的文件。第一个文件将会是pem格式的客户端证书。这个证书将会被发送给服务端。第二个文件是客户端的私钥(也是pem格式的),它被用来在握手过程成确认你是否是客户端证书的拥有者。

不幸的是,Java只支持PKCS12格式,因此我们就得将我们的证书和私钥翻译成PKCS12格式的。我们可以使用OpenSSL来做这件事情。

1.$ openssl pkcs12 -export \

2.    -in client.crt \

3.    -inkey client.key \

4.    -out key.p12 \

5.    -name client

我们从client.crt和client.key文件生成了key.p12文件。这里需要再次输入密码。这个密码是要被用来保护私钥的。

从PKCS12格式的文件我们可以通过将PKCS12引入到新的keystore中,来生成另外一个keystore文件:

1.$ keytool -importkeystore \

2.    -destkeystore key.jks \

3.    -deststorepass <<keystore_password>> \

4.    -destkeypass <<key_password_in_keystore>> \

5.    -alias client \

6.    -srckeystore key.p12 \

7.    -srcstoretype PKCS12 \

8.    -srcstorepass <<original_password_of_PKCS12_file>>

这个命令看起来更加复杂一点,不过解密过程是一样简单的。在命令的开头我们对新的叫做的key.jks的keystore的参数进行了声明。我们定义了keystore的密码以及私钥的密码,它们都会被keystore用到。我们也将私钥分配给了keystore中的一些别名(在本例中就是isclient)。接下来,我们对源文件(key.p12)进行了指定,还有文件的格式以及原来的密码。

有了trusted.jks和key.jks,我们就可以开始写代码了。达内广州web培训觉得第一步得描述一下如何去使用keystore:

1.File trustedKeystoreFile = new File("trusted.jks");

2.File keystoreFile = new File("key.jks");

3. 

4.SSLContext sslcontext = SSLContexts.custom()

5.    .loadTrustMaterial(trustedKeystoreFile,

6.                    "<<trusted_keystore_password>>".toCharArray())

7.    .loadKeyMaterial(keystoreFile,

8.                    "<<keystore_password>>".toCharArray(),

9.                    "<<original_password_of_PKCS12_file>>".toCharArray())

10.    .build();

11. 

12.SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(

13.                sslcontext,

14.                new String[]{"TLSv1.2"},

15.                null,

16.                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

我们使用了keystore文件并且构建了一个SSL上下文。接下来,我们创建了socket文件,它能为我们的请求提供合适的HTTPS连接。

最后我们就可以用Java来调用我们的端点了:

1.try (CloseableHttpClient httpclient = HttpClients.custom()

2.        .setSSLSocketFactory(sslsf)

3.        .build()) {

4. 

5.    HttpGet httpGet = new HttpGet("https://ourserver.com/our/endpoint");

6. 

7.    try (CloseableHttpResponse response = httpclient.execute(httGet)) {

8.        HttpEntity entity = response.getEntity();

9.        System.out.println(response.getStatusLine());

10.        EntityUtils.consume(entity);

11.    }

12.}

在创建两个等于我们原来的证书和私钥的文件(keystore)之后,我们用Java实现了融合认证。

上一篇:没有上一篇了
下一篇:HTTPS和Java有怎样的关系?

马上预约三天免费体验课

姓名:

电话:

你需要了解的搜索功能

达内广州web培训详解http缓存和cookie

达内广州web培训详解缓存Websql

达内广州web培训详解缓存indexDB

选择城市和中心
江西省

贵州省

广西省

海南省