Tag: x509certificate

在spring的resttemplate发出的每个请求发送客户端证书的正确方法是什么?

我想用我的spring应用程序使用REST服务。 要访问该服务,我有一个客户端证书(自签名和.jks格式)进行授权。 对其他服务进行身份validation的正确方法是什么? 这是我的要求: public List getInfo() throws RestClientException, URISyntaxException { HttpEntity httpEntity = new HttpEntity(null, new HttpHeaders()); ResponseEntity resp = restOperations.exchange( new URI(BASE_URL + “/Info”), HttpMethod.GET, httpEntity, Info[].class); return Arrays.asList(resp.getBody()); }

检查checkServerTrusted中的服务器证书时出现问题

我在这篇文章中指的是针对CA的Validate X.509证书 。 我的checkServerTrusted实现如下: @Override public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException{ InputStream inStream; try { inStream = new FileInputStream(“E:\\Desktop\\cert\\domain.crt”); CertificateFactory cf = CertificateFactory.getInstance(“X.509”); X509Certificate Mycert = (X509Certificate)cf.generateCertificate(inStream); inStream.close(); if (certs == null || certs.length == 0 || authType == null || authType.length() == 0) { throw new IllegalArgumentException(“null or zero-length parameter”); } for […]

如何使用Java创建X509证书?

我想使用Java语言创建X509证书,然后从中提取公钥。 我搜索了互联网,发现了许多代码示例,但是所有代码都有错误(未知变量或未知类型)或者有很多警告,例如:“方法……来自类型……已被弃用”等。 例如,为什么以下代码不起作用: PublicKey pk; CertificateFactory cf = CertificateFactory.getInstance(“X.509”); String PKstr = pk.toString(); InputStream PKstream = new ByteArrayInputStream(PKstr.getBytes()); X509Certificate pkcert = (X509Certificate)cf.generateCertificate(PKstream); 谁能告诉我如何使用纯Java或Bouncy Castle创建证书,然后从中获取公钥? 谢谢大家。

实现X509TrustManager – 将部分validation传递给现有validation程序

我需要忽略PKIX路径构建exception javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExc ption: unable to find valid certification path to requested target 我知道如何通过编写我自己的实现X509TrustManager的类来实现这一点,我总是从isServerTrusted return true 。 但是,我不想信任所有服务器和所有客户端。 我希望像当前​​一样为客户端完成所有默认validation。 对于服务器,我想忽略仅针对一个特定证书的服务器证书validation,但是希望继续进行validation,就像当前所做的那样(例如,使用cacerts商店)。 我怎样才能实现这样的目标 – 即在我更换之前将部分validation传递给X509TrustFactory对象。 这就是我想要做的 public boolean isServerTrusted(X509Certificate[] chain) { if(chain[0].getIssuerDN().getName().equals(“MyTrustedServer”) && chain[0].getSubjectDN().getName().equals(“MyTrustedServer”)) return true; // else I want to do whatever verification is normally done } 另外我不想打扰现有的isClientTrustedvalidation。 我怎样才能做到这一点?

如何在HttpsURLConnection中使用证书身份validation?

我正在尝试连接到HTTPS URL,但我需要使用客户端身份validation和第三方软件在我的系统上放置的证书。 我一点也不知道我应该如何找到或使用它,而我所要做的只是C#示例代码,它与我发现的所有Java答案有很大不同。 (例如,KeyStore显然需要某种密码?) 这是我的C#示例代码 System.Security.Cryptography.X509Certificates.X509CertificateCollection SSC_Certs = new System.Security.Cryptography.X509Certificates.X509CertificateCollection(); Microsoft.Web.Services2.Security.X509.X509CertificateStore WS2_store = Microsoft.Web.Services2.Security.X509.X509CertificateStore.CurrentUserStore( Microsoft.Web.Services2.Security.X509.X509CertificateStore.MyStore); WS2_store.OpenRead(); Microsoft.Web.Services2.Security.X509.X509CertificateCollection WS2_store_Certs = WS2_store.Certificates; 然后它只是迭代WS2_store_Certs CertificateCollection并以这种方式检查它们。 再进一步,它设置这样的证书: HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url_string); httpWebRequest.ClientCertificates = SSC_Certs; 这一切看起来都很合理,即使我不知道它是如何找到证书的,但我仍然无法找到Java的等价物。 UPDATE 我正在建立的连接是依赖于JDK 5的更大应用程序的一部分,但我已经设法使用sunmscapi jar来查找我正在寻找的证书。 当我尝试使用Windows密钥库进行连接时出现错误,所以我认为通过从Windows应用程序获取我需要的证书并将其插入默认的java文件中我解决了这个问题。 现在我收到一个EOFException,然后是SSLHandshakeException,说“握手期间远程主机关闭连接”。 ssl调试跟踪不会向我显示直接问题,因为我需要的证书显示在此处的证书链中。 它完成了整个ClientKeyExchange的事情,说它已经完成,然后我从调试日志中得到的最后一条消息就是 [write] MD5 and SHA1 hashes: len = 16 0000: 14 00 00 0C D3 E1 E7 […]

Java X509证书解析和validation

我试图在几个步骤中处理X509证书并遇到几个问题。 我是JCE的新手,所以我还没有完全了解所有内容。 我们希望能够根据不同的编码(PEM,DER和PCKS7)解析几个不同的X509证书。 我使用FireFox(证书包括链)以PEM和PCKS7格式从https://belgium.be导出相同的证书。 我已经留下了一些问题所不需要的线条 public List parse(FileInputStream fis) { /* * Generate a X509 Certificate initialized with the data read from the inputstream. * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates. */ List certificates = null; log.debug(“Parsing new certificate.”); certificates = (List) cf.generateCertificates(fis); return certificates; } 只要我使用FileInputStream而不是PCKS7的BufferedInputStream,这段代码工作正常,我觉得这很奇怪? 但我可以忍受它。 下一步是validation这些证书链。 1)检查所有证书是否都有有效日期(简单)2)使用OCSPvalidation证书链(如果证书中未找到OCSP URL,则回退到CRL)。 这是我不完全确定如何处理这个问题的地方。 […]

X509TrustManager覆盖而不允许所有证书?

我目前正在重写X509TrustManager以允许所有证书作为临时“解决方案”(此时不安全)。 我试图弄清楚我将如何添加,所以它只接受我遇到问题的特定证书,直到可以进行适当的修复(目前不在我的手中)。 这是当前的代码。 TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { } }}; try { SSLContext sc = SSLContext.getInstance(“SSL”); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (GeneralSecurityException e) { System.out.println(e.getStackTrace()); }

在Java中针对CAvalidationX.509证书

可以说我有这样的东西(客户端代码): TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { } @Override public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { } } }; SSLContext sslc = SSLContext.getInstance(“TLS”); sslc.init(null, trustAllCerts, null); SocketFactory sf = sslc.getSocketFactory(); SSLSocket s = (SSLSocket) sf.createSocket(“127.0.0.1”, […]

在文件系统上直接使用PEM编码CA证书进行HTTPS请求?

这类似于将PEM导入Java密钥库 。 但问题的答案使用OpenSSL进行转换和工具,将它们导入文件系统的密钥存储区。 我正在尝试使用格式良好的X509证书作为信任锚: static String CA_FILE = “ca-rsa-cert.pem”; public static void main(String[] args) throws Exception { KeyStore ks = KeyStore.getInstance(“JKS”); ks.load(new FileInputStream(CA_FILE), null); TrustManagerFactory tmf = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); SSLContext context = SSLContext.getInstance(“TLS”); context.init(null, tmf.getTrustManagers(), null); // Redirected through hosts file URL url = new URL(“https://example.com:8443”); HttpsURLConnection connection = (HttpsURLConnection) url .openConnection(); connection.setSSLSocketFactory(context.getSocketFactory()); … […]

在java中validation证书会引发exception – 无法找到所请求目标的有效证书路径

我有一个Web应用程序,要求客户端发送它的证书,服务器必须validation证书(即查看颁发者是否是有效的颁发者并出现在服务器的信任库中)。 这是代码: FileInputStream fin=new FileInputStream(“C:/trustedca”); KeyStore anchors = KeyStore.getInstance(“JKS”,”SUN”); anchors.load(fin, “server”.toCharArray()); X509CertSelector target = new X509CertSelector(); FileInputStream fin1=new FileInputStream(“C:/client.crt”); CertificateFactory cf=CertificateFactory.getInstance(“X.509”); X509Certificate cert=null; while (fin1.available() > 0) { System.out.println(“in while———“); cert =(X509Certificate) cf.generateCertificate(fin1); } target.setCertificate(cert); PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target); CertPathBuilder builder = (CertPathBuilder) CertPathBuilder.getInstance(“PKIX”).build(params); PKIXCertPathBuilderResult r = (PKIXCertPathBuilderResult) builder.build((CertPathParameters)params); 但我得到一个例外: sun.security.provider.certpath.SunCertPathBuilderException: unable to […]