【发布时间】:2018-02-26 08:56:25
【问题描述】:
我们在给定的 URL https://.com?service.wsdl 上发布了一个 Web 服务
为了制作它的Java客户端, 1)我从 Firefox 下载了它的 .crt 文件作为导出证书>>保存到文件>>它自动采用了 .crt 扩展名。
2) 我在 Java 程序中使用了该 .crt 文件并将其设置在 SSLContextFactory 中并创建了 HttpsURLConnection 并能够发布数据并获得结果。
InputStream certstream = fullStream ("path to .crt file /ABC.crt");
Certificate certs = cf.generateCertificate(certstream);
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("isakey", certs);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = context.getSocketFactory();
URL url;
HttpsURLConnection urlConn;
url = new URL("https://path to web service /");
String rawData = "param1=abc¶m2=efg";
byte[] postData = rawData.getBytes(StandardCharsets.UTF_8);
urlConn = (HttpsURLConnection) url.openConnection();
urlConn.setSSLSocketFactory(sslSocketFactory);
根据我的理解,上面的代码是读取证书并将其包装在每个请求中。
一切都很好,直到管理层要求我与同样是同一 Web 服务消费者的其他团队共享证书。
其他团队使用 .NET C# 连接到 WS。
在我分享之后,.NET 团队要求我分享私钥。
现在我想知道是因为
1) 据我了解,他们可以询问 public key ..not the private key 。因为私钥是服务器拥有的并且是机密的。 2)通过Firefox导出证书时,如果附带公钥,则其中包含密钥。我看到那个选项没有启用。 所以这个证书中没有公钥。
3) 其他团队说因为他们的客户端在 .NET 中并且它不接受 .crt 文件,它只接受 .pfx 文件。
有可能吗?是证书格式技术依赖。
即使他们说只能接受 .pfx 文件,他们也应该使用自己的私钥将 .crt 文件转换为 .pfx 。 有将 crt 文件转换为 pfx 的命令,但我认为这个 .NET 团队必须使用他们自己的私钥
将 PEM 证书文件和私钥转换为 PKCS#12 (.pfx .p12)
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
privateKey.key 哪里有私钥。
有人可以帮助我了解他们的情况吗?
【问题讨论】:
-
这个问题有点不清楚。我们得到了你所做的和你得到的结果。我们仍然不知道您的最终目标是什么。
标签: c# .net x509certificate pfx