Tag: keystore

Java的keytool命令,带有IP地址

我试图通过httpsurl获取图片,但我遇到了一些问题。 我用Java的keytool命令生成一个密钥库。 如果我指定公共名称(CN)等于我的主机名,例如CN = JONMORRA,然后尝试通过我的主机名查询,例如https:// JONMORRA:8443 /那么它工作正常。 但是,如果我将公共名称指定为我的IP地址,例如CN = 192.168.56.1,并尝试通过我的IP地址查询,例如https://192.168.56.1:8443/然后我收到错误 HTTPS主机名错误:应为 这说明我的主机名是错误的,即使这是我在密钥库中指定的内容。 我想使用ip地址而不是主机名,这样我就可以在Linux和Windows机箱之间进行查询,而无需担心主机名。 为什么CN不接受IP地址,我该如何解决? 谢谢

密钥库不适用于Java 9

我已经使用portecle将JKS密钥库转换为P12格式,但它可能并不顺利。 密钥库使用Java 8(各种版本),但使用Java 9(OpenJDK 64位服务器VM(构建9内部+ 0-2016-04-14-195246.buildd.src,混合模式),我得到了 java.io.IOException: Invalid keystore format at sun.security.provider.JavaKeyStore.engineLoad(java.base@9-internal/JavaKeyStore.java:659) at sun.security.util.KeyStoreDelegator.engineLoad(java.base@9-internal/KeyStoreDelegator.java:219) at java.security.KeyStore.load(java.base@9-internal/KeyStore.java:1466) at org.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:52) at org.eclipse.jetty.util.ssl.SslContextFactory.loadKeyStore(SslContextFactory.java:998) at org.eclipse.jetty.util.ssl.SslContextFactory.load(SslContextFactory.java:252) at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:219) 有趣的是Java 8 keytool显示 Keystore type: JKS Keystore provider: SUN Your keystore contains 5 entries … entries listed 而来自Java 9的那个显示 Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 5 entries … […]

javax.net.ssl.SSLHandshakeException:收到致命警报:unknown_ca

我必须通过SSL双重身份validation连接到服务器。 我已将自己的私钥加证书添加到keystore.jks ,将服务器的自签名证书添加到truststore.jks ,这两个文件都复制到/ usr / share / tomcat7。 我的代码使用的套接字工厂由以下提供者提供: @Singleton public static class SecureSSLSocketFactoryProvider implements Provider { private SSLSocketFactory sslSocketFactory; public SecureSSLSocketFactoryProvider() throws RuntimeException { try { final KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); final InputStream trustStoreFile = new FileInputStream(“/usr/share/tomcat7/truststore.jks”); trustStore.load(trustStoreFile, “changeit”.toCharArray()); final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); final InputStream keyStoreFile […]

连接到SoftHSM java

码: String pkcs11cfg = “pkcs11.cfg”; Provider p = new SunPKCS11(pkcs11cfg); Security.addProvider(p); KeyStore ks = KeyStore.getInstance(“PKCS11”, p); ks.load(null, pin); System.out.println(ks.size()); // prints 0 CFG: name = pkcs11Test library = /usr/local/lib/libsofthsm.so slot = 1 问题是我有一些密钥对,我用pkcs11-tool添加它们。 softhsm的版本是1.2.1 为什么KeyStore中没有任何别名? 如何解决这个问题?

Tomcat HTTPS密钥库证书

使用SSL和Tomcat进入另一个问题:我已经配置了一个密钥库,其中包含密钥和证书(我希望向连接到该站点的客户端提供的服务器证书)。 我为信任库做了同样的事情(我将需要客户端身份validation)。 我现在遇到的问题是,当我通过HTTPS连接到我的Tomcat实例时,呈现给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的密钥。 使用-Djavax.net.debug = ssl显示它为客户端身份validation提供了正确的CA,但没有提供正确的服务器证书。 添加为可信证书:主题:CN = A发行者:CN = A算法:RSA; 序列号: – 从2009年11月10日星期二14:48:31 CET到2009年2月8日星期一14:48:31 CET 2010添加为可信证书:主题:X发行人:X算法:RSA; 序列号: – 有效期为2005年1月19日星期三01:00:00 CET至2015年1月19日星期一00 00:59:59 我用占位符取代了真正的价值观。 A =服务器的域名(但在这种情况下,由于某种原因,这是密钥而不是证书)。 X = VeriSign CA(这应该是正确的)。 我有一个现有的证书,我想用它来呈现给客户端,我使用keytool将其导入JKS密钥库。 Tomcat连接器配置: 连接器端口=“444”协议=“HTTP / 1.1”SSLEnabled =“true” maxThreads =“150”scheme =“https”secure =“true” clientAuth =“false”sslProtocol =“TLS” keystoreFile = “CONF / SSL / keystore.jks” keystorePass = “XX” keyAlias = “密押” […]

以编程方式将.cer证书导入密钥库

如何将类路径中的.p12证书导入java密钥库? 首先,我使用了InstallCert https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java并进行了一些更改,因此服务器证书将被导入到java安装目录中的密钥库中。 这工作正常,但现在我想从我的类路径加载证书。 编辑:我只是使用.cer证书,请参阅下一个答案

SSLHandshakeException:收到致命警报:在Java 6 – > 8升级后的handshake_failure

我们最近更新了一个从Java 6到Java 8的项目,现在我们已经打了一个关于SSL握手的问题。 服务层使用客户端来请求和接收来自第三方应用程序的呼叫。 在服务层中,使用初始化密钥库 System.setProperty(“javax.net.ssl.trustStore”, keyStoreFile); System.setProperty(“javax.net.ssl.trustStorePassword”, keyStorePassword); 并通过applicationContext.xml注入: 奇怪的是:1。显然,这不是一个完整的文件路径。 2.此服务器上没有密钥库(无论Java 6如何,它都可以工作)。 如果出现错误,客户端应该信任所有证书: /** * Sets a trust manager that ignores the certificate chains. Use if the * server has a certificate that can’t be verified. * */ private void trustHttpsCertificates() throws Exception { try { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); // Create a trust manager that […]

我谈到的Web服务器更新了它的SSL证书,现在我的应用程序无法与之通信

Web服务器将其SSL证书更新为新的verisign签名证书,我的Java应用程序无法再连接。 我在/ usr / java / jre / lib / security中使用带有日期的java 5和2006年11月的cert文件 我明白了 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) […]

如何在连接之前告诉SSLSocket所需的密钥条目的别名?

我在java密钥库中有两个证书/密钥对。 这些关键词的别名是“foo”和“bar”。 我的TLS客户端(java程序)使用密钥库。 在连接打开期间完成TLS客户端身份validation。 当TLS服务器从客户端请求证书时,客户端程序应使用“foo”键入。 现在,客户端在连接握手期间向服务器发送错误的证书(“bar”)。 如何在连接之前告诉SSLSocket所需的密钥条目的别名? 目前代码如下: final SSLSocket ss = (SSLSocket)SSLSocketFactory.getDefault().createSocket(); ss.setEnabledProtocols( new String[] {“TLSv1”}); ss.connect( targetAddress );

在Google App Engine Java应用程序中加载自定义密钥库

我想使用URLFetch服务在Google App Engine应用中打开HTTPS连接。 为了能够validation我的应用正在与之交谈的服务器的SSL证书,我使用自己的密钥库文件 。 我想在我的应用程序加载时,即在执行任何HTTPS请求之前,在预热请求中读取此文件。 密钥库文件是我的WAR文件的一部分。 TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(ClassLoader.getSystemResourceAsStream(“myKeystoreFile”), “password”.toCharArray()); trustManagerFactory.init(keystore); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); SSLContext sslContext = SSLContext.getInstance(“SSL”); sslContext.init(null, trustManagers, null); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 但是,我不能使用这种方法,因为虽然HttpURLConnection在GAE的JRE白名单上,但HttpsUrlConnection不是。 还有另一种在GAE中使用自定义密钥库的方法吗? 我在GAE文档中没有找到任何相关信息。 看起来Google的URLFetch服务支持HTTPS时,无法自定义密钥库。 它是否正确? 如果这是不可能的,那么这种方法一般是否仍然有效? 或者是否有一种不同的方法仍然允许我validationSSL证书? UPDATE 2009年,谷歌的App Engine开发者Nick Johnson在https://groups.google.com/d/topic/google-appengine-python/C9RSDGeIraE/discussion上说: urlfetch API不允许您指定自己的客户端证书,因此很遗憾您目前无法实现所需的目标。 这还是正确的吗? 如果App Engine中的每个HTTP(s)请求都依赖于URLFetch,这意味着GAE中根本无法使用自定义证书。