繁体   English   中英

与.crt一起使用KeyStore

[英]using KeyStore with .crt

我需要将应用程序与强制使用https的外部Web服务集成在一起。 该Web服务的作者向我提供了.crt文件,我应该使用它来进行https请求。 经过一番调查,我发现以下代码使用KeyStore类进行安全的https访问:

        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream instream = new FileInputStream(new File(file));
        try {
            trustStore.load(instream, password.toCharArray());
        } finally {
            instream.close();
        }

        SSLContext sslcontext =
                SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
        SSLConnectionSocketFactory sslsf =
                new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"}, null,
                                               BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        HttpClients.custom().setSSLSocketFactory(sslsf).build();

在此代码中,KeyStore需要输入流以及密码 trustStore.load(instream, password.toCharArray()) 但是,据我了解,使用.crt文件时不需要密码。 因此,这种加载证书的方式不适合我。 同时,根据到目前为止的发现,这里提供的代码是配置HttpClient使用SSL证书的唯一方法。 是否有任何变通方法来配置HttpClient以使用.crt证书?

谢谢,

安德烈

我认为Web服务正在为您提供一个自签名证书(即未由著名的CA签名)。 如果它已经由Java的cacerts文件中的一个著名CA签名,则您无需执行任何操作。

否则,您有两种选择:

  1. 将证书导入全局cacerts密钥库
  2. 使用特定于应用程序的密钥库启动您的应用程序

无论哪种情况,您都首先需要将crt文件转换为Java使用的jks密钥库。 您可以通过以下方式做到这一点:

$ keytool -import -keystore mykeystore.jks -storepass horsestaple

请注意,密钥工具需要密码( horsestaple以上),用于创建JKS存储要被提供。 您可以在这里放任何东西; 如您所述,公共网站证书不需要密码保护,毕竟它们是公共的。

如果要执行选项1,请备份cacerts并提供cacerts文件而不是mykeystore.jks。 有关cacert的位置,请参见下面的链接。 对于此选项,您已经准备就绪,您的应用程序应该通过HTTPS连接到Web服务,而无需任何其他配置,因为Java默认情况下会加载cacerts。

如果您正在执行选项2,这至少在测试阶段可能是首选,那么您需要使用以下参数运行应用程序:

-Djavax.net.ssl.trustStore=mykeystore.jks

这是JVM参数,因此请适当提供。 这取决于您如何运行应用程序。

请注意,在这种情况下,您只有导入的证书,因此您的其他HTTPS连接将不起作用。 您可以通过以下方法来避免这种情况:首先将标准cacerts复制到一个临时位置,将密钥导入其中,然后在上面的命令中使用它。 这将为您提供所有标准证书,再加上您需要的证书。

选项2的一个缺点是,如果添加或吊销了新证书,则不会更新您的应用程序特定的密钥库。 如果这是一个问题,则可以动态合并密钥库,例如:

无论哪种情况,您现在都应该能够执行标准的URL提取,例如此处给出的示例:

即:

final URL url = new URL("https://example.com");
try(final InputStream in = url.openStream()){
  //…
}

此处的更多信息:

  • 键盘工具和一般证书信息

https://docs.oracle.com/cd/E19830-01/819-4712/ablqw/index.html

  • 证书位置

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html

  • 导入自签名证书的更多选项

默认情况下,如何正确地将自签名证书导入到Java密钥库中,所有Java应用程序都可以使用该证书?

希望这可以帮助。

除非他们有哪些应该用于验证 它们的连接,这表明他们正在使用自签名证书 .crt文件提供你,他们没有任何有用只要你。 如果需要证书作为客户端 ,那么您首先需要的是公钥/私钥对,从中生成一个CSR,并进行签名。 除了已签名的证书,没有其他人可以安全地提供任何其他内容。

如果他们提供了自己的(自签名?)证书,则需要通过带有-trustcacerts选项的keytool将其加载到信任库中,而不是密钥库中,然后通过javax.net.ssl.trustStore告诉Java使用该信任库。 javax.net.ssl.trustStore系统属性,或者通过构造自己的TrustManager并将其提供给自定义SSLContext ,如《 JSSE参考指南》中所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM