相关疑难解决方法(0)

如何在Java密钥库中导入现有的x509证书和私钥以在SSL中使用?

我在activemq配置中有这个

<sslContext>
        <sslContext keyStore="file:/home/alex/work/amq/broker.ks"  
 keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" 
 trustStorePassword="password"/>
</sslContext>
Run Code Online (Sandbox Code Playgroud)

我有一对x509证书和一个密钥文件

如何导入这两个用于ssl和ssl + stomp连接器?我可以谷歌的所有例子总是自己生成密钥,但我已经有了密钥.

我试过了

keytool -import  -keystore ./broker.ks -file mycert.crt
Run Code Online (Sandbox Code Playgroud)

但这只导入证书而不是密钥文件并导致结果

__CODE__

我尝试连接证书和密钥但得到了相同的结果

如何导入密钥?

java ssl activemq-classic jms jks

218
推荐指数
11
解决办法
40万
查看次数

如何将.cer证书导入java密钥库?

在开发Java Web服务客户端期间,我遇到了一个问题.Web服务的身份验证使用客户端证书,用户名和密码.我从webservice后面的公司收到的客户证书是.cer格式化的.当我使用文本编辑器检查文件时,它具有以下内容:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

我可以在Internet Explorer中将此文件作为证书导入(无需输入密码!)并使用它来通过Web服务进行身份验证.

通过首先剥离第一行和最后一行,转换为unix换行符并运行base64-decode,我能够将此证书导入密钥库.可以将生成的文件导入密钥库(使用该keytool命令).当我列出密钥库中的条目时,此条目属于该类型trustedCertEntry.由于此条目类型(?),我无法使用此证书对Web服务进行身份验证.我开始认为提供的证书是用于身份验证的公共证书...

我找到的解决方法是在IE中导入证书并将其导出为.pfx文件.此文件可以作为密钥库加载,并可用于对Web服务进行身份验证.但是,我不能指望我的客户每次收到新证书时都会执行这些步骤.所以我想将.cer文件直接加载到Java中.有什么想法吗?

附加信息:webservice背后的公司告诉我,应该从PC和用户那里请求证书(使用IE和网站),以便稍后导入证书.

java certificate keystore

208
推荐指数
7
解决办法
79万
查看次数

与Android应用程序中的客户端证书的HTTPS连接

我正在尝试用我正在编写的Android应用程序中的HTTPS连接替换当前正在运行的HTTP连接.HTTPS连接的额外安全性是必要的,因此我不能忽略此步骤.

我有以下内容:

  1. 服务器配置为建立HTTPS连接,并需要客户端证书
    • 此服务器具有由标准大型CA颁发的证书.简而言之,如果我通过Android中的浏览器访问此连接,它可以正常工作,因为设备信任库可以识别CA. (所以它不是自签名的)
  2. 客户端证书,基本上是自签名的.(由内部CA发布)
  3. 一个Android应用程序,它加载此客户端证书并尝试连接到上述服务器,但具有以下问题/属性:
    • 当服务器被配置为客户端可以连接到服务器要求客户端证书.基本上,如果我使用SSLSocketFactory.getSocketFactory()连接工作正常,但客户端证书是此应用程序规范的必需部分,因此:
    • javax.net.ssl.SSLPeerUnverifiedException: No peer certificate当我尝试连接我的自定义时SSLSocketFactory,客户端会产生异常,但我不完全确定原因.在互联网上搜索各种解决方案后,这个例外似乎有点模棱两可.

以下是客户端的相关代码:

SSLSocketFactory socketFactory = null;

public void onCreate(Bundle savedInstanceState) {
    loadCertificateData();
}

private void loadCertificateData() {
    try {
        File[] pfxFiles = Environment.getExternalStorageDirectory().listFiles(new FileFilter() {
            public boolean accept(File file) {
                if (file.getName().toLowerCase().endsWith("pfx")) {
                    return true;
                }
                return false;
            }
        });

        InputStream certificateStream = null;
        if (pfxFiles.length==1) {
            certificateStream = new FileInputStream(pfxFiles[0]);
        }

        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        char[] password = "somePassword".toCharArray();
        keyStore.load(certificateStream, password); …
Run Code Online (Sandbox Code Playgroud)

java ssl https android certificate

31
推荐指数
2
解决办法
2万
查看次数

如何请求需要客户端证书进行身份验证的URL

我需要从使用客户端证书进行身份验证的服务器请求URL,但无法找到为我的应用程序执行此操作的方法.

我的问题是我正在处理的Java客户端有本地可用的证书文件,但是由于它将在其上运行的PC的限制,它无法在密钥库中安装证书.

简而言之,我只是希望能够明确指定用于我需要检索的URL的证书.

有什么建议?

java security url network-programming

15
推荐指数
1
解决办法
3万
查看次数

Java:如何添加SSL客户端身份验证

我有这个代码使用SSL连接服务器和客户端,现在我想添加客户端身份验证:

(我有一个服务器密钥库(JCEKS类型)和一个客户端密钥库(JKS类型),服务器使用信任库(cacerts),我导入了两个证书,因为我也想使用此信任库进行客户端身份验证)

客户代码:

System.setProperty("javax.net.ssl.trustStore", cerServer);
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);

SSLSocketFactory sslsocketfactory = (SSLSocketFactory)  SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);
Run Code Online (Sandbox Code Playgroud)

服务器代码:

KeyStore ks = LoadKeyStore(new File(serverKeyStore), pwdKeyStore, "JCEKS");
KeyManagerFactory kmf; 
kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pwdKeyStore.toCharArray());

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(),null, null);   

SSLServerSocketFactory ssf = sc.getServerSocketFactory(); 
sslserversocket = (SSLServerSocket) ssf.createServerSocket(port);
Run Code Online (Sandbox Code Playgroud)

提前感谢您的帮助.

编辑:我在服务器端添加此代码:

System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStoreType","JKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
Run Code Online (Sandbox Code Playgroud)

但如果我在cacerts中删除客户端证书,连接不会给我错误,因此我认为这是错误的

java authentication ssl

11
推荐指数
1
解决办法
2万
查看次数

Restlet javax.net.ssl.SSLHandshakeException:null cert chain

我正在本地测试客户端和服务器之间的SSL通信.所以我使用OpenSSL命令生成证书.在cacert文件中添加了此证书.还生成.p12文件.

我在服务器和客户端使用相同的.p12文件.这是服务器代码

Server server = component.getServers().add(Protocol.HTTPS, port);
Series<Parameter> params = server.getContext().getParameters();

params.add("keystorePath", ".p12 file path");
params.add("keystoreType", "PKCS12");
params.add("needClientAuthentication","true");

component.getDefaultHost().attach("", "/AA"), new AAClass());
component.start();
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

Client client = trustAllCerts();
clientResource = new ClientResource(url);
clientResource.setNext(client);
try{
      clientText = clientResource.post"");
 }
 catch(ResourceException e){
    e.printStackTrace();
 }

public Client trustAllCerts() {
    Client client = null;
    try {
        client = new Client(new Context(), Protocol.HTTPS);
        Context context = client.getContext();


        final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        context.getAttributes().put("sslContextFactory", new SslContextFactory() {
            public void init(Series<Parameter> parameters) {

            }

            public SSLContext createSslContext() …
Run Code Online (Sandbox Code Playgroud)

java ssl restlet sslhandshakeexception restlet-2.3.1

10
推荐指数
2
解决办法
2万
查看次数

使用.p12文件执行对休息服务器的请求

我正在尝试执行对服务器的请求,该服务器向我提供了.p12文件,以便与其余服务建立安全连接,我正在执行以下操作,以使用密钥设置HttpClient:

SSLContext sslContext =SSLContextBuilder
                .create().loadKeyMaterial(ResourceUtils.getFile("classpath:keystore/file.p12"), "secret".toCharArray(), "secret".toCharArray())
                .build();

    return HttpClientBuilder
            .create()
            .setConnectionManager(connManager())
            .setSSLContext(sslContext)
            .setDefaultRequestConfig(requestConfig())
            .build();
Run Code Online (Sandbox Code Playgroud)

当我使用OAuth2RestOperations执行请求时,我得到了:

401 , Non existing certificate or invalid 
Run Code Online (Sandbox Code Playgroud)

java spring-boot oauth2resttemplate

10
推荐指数
1
解决办法
151
查看次数

从私钥和cer文件创建SSLContext

我有两个文件:mycer.cer mykey.key

我需要使用java创建SslContext以通过SSL连接到另一台服务器.我试图找出如何直接从这些文件创建SslContext对象.

这篇文章可能是重复的,但我试图用一个例子找到一个清晰的解释来创建SslContext,但没有找到清楚的东西.

提前致谢

java ssl pem cer

7
推荐指数
1
解决办法
1043
查看次数

如何使用HTTP客户端传递客户端证书?

我想在服务A和B之间使用相互SSL身份验证.我目前正在实现从Java中的服务A传递客户端证书.我正在使用Apache DefaultHttpClient来执行我的请求.我能够从内部凭据管理器检索我的服务A的客户端证书,并将其保存为字节数组.

DefaultHttpClient client = new DefaultHttpClient();
byte [] certificate = localCertManager.retrieveCert();
Run Code Online (Sandbox Code Playgroud)

我在这方面的经验很少,我很感激你的帮助!

我想也许它应该以某种方式通过HTTP客户端或可能在标头中的参数传递.

如何使用HTTP客户端传递客户端证书?

apache ssl https ssl-certificate apache-commons-httpclient

6
推荐指数
2
解决办法
2万
查看次数

使用Scala Dispatch发送证书文件

我需要能够发送证书文件(.pem,我认为),使用scala和dispatch发送get请求.

你是怎样做的?

scala scala-dispatch

5
推荐指数
1
解决办法
1517
查看次数

Java Https客户端证书的工作方式与浏览器或其他工具完全不同

似乎我们无法配置我们的Java客户端来正确处理SSL连接.

我们可以使用具有指定客户端证书和curl工具的浏览器成功连接到HTTPS URL,但不能使用我们的java客户端或基于java的SOAP UI工具.即使我们在浏览器中使用相同的*.p12证书(工作正常)并在SOAP UI工具中(不起作用).

所以,我们有以下信息:

  1. 公共客户证书(pem格式)
  2. 客户端的私钥(pem格式)
  3. 服务器用于验证客户端证书的CA.

我们将这些pem证书转换为jks和p12,并使用apache http client进行连接.并且正如提到的那样,相同的证书适用于浏览器,但对于自定义客户端或基于Java的Java UI都不起作用.

首先,我猜测我们在那里描述了以下问题:
当服务器请求客户端证书(作为TLS握手的一部分)时,它还将提供可信CA的列表作为证书请求的一部分.如果您希望提供用于身份验证的客户端证书未由其中一个CA签名,则根本不会显示该证书

但似乎我们有这样的问题它不会解析浏览器的这个证书.因为默认情况下浏览器默认不允许使用不正确的(具有不同的颁发者)证书.

我根据以下教程创建的客户端:

所以,基本上我有问题:

  1. 如何知道客户端证书是否全部发送:我们使用org.apache.http.conn.ssl.SSLSocketFactory可能在什么地方进行调试;
  2. 问题可能是什么,可能是描述浏览器SSL配置和基于java的工具(可能更严格地说是java SSL验证)的差异的任何好的参考?

更新1

我们尝试使用openssl s_client工具.输出显示服务器证书符合我们的预期,但客户端证书验证没有CA:未

发送客户端证书CA名称

openssl s_client的语法,如果使用连接到443而没有指定模式(https://).所以我们决定在没有架构的情况下在浏览器中尝试我们的URL但使用443端口.服务器响应:

普通HTTP请求已发送到HTTPS端口

接下来我们在这次调查中的步骤是尝试wireshark.首先我们使用浏览器进行了正确的会话,然后我们尝试了我们的应用 我们也试过openssl s_client.

区别在于服务器密钥交换数据包.虽然浏览器数据包有一个证书请求,但openssl和我们的应用程序在该数据包中没有这样的字段.此外,如果浏览器不发送任何证书,则该字段仍然存在于数据包中.

因此,只有浏览器获得证书请求.任何关于为什么会发生这种情况的想法都值得赞赏

评论中的问题答案

  • 我们正在使用java 1.7
  • 它是初始客户端证书身份验证
  • 当我们使用时, openssl s_client -connect your.server.name:443 我们返回有效的服务器证书并且没有发送客户端证书CA名称.我们还得到验证错误:num = 2:无法获得颁发者证书.
  • 我们从s_client和浏览器获得的服务器证书是相同的
  • 没有公布的CA证书列表没有发送客户端证书CA名称

更新2

经过一些调查和研究,我们设法找出问题的根本原因.所以我们在服务器上启用了SNI(服务器名称指示),我们的应用程序正在使用apache httpclient 4.2.1.此版本的客户端不支持SNI扩展,也不在Client Hello数据包中发送server_name扩展.之后该服务器不通告客户端使用客户端证书进行身份验证.此问题已在4.3.2版本中修复.

现在我们正在尝试检查4.3.2版本的httpclient是否正确发送server_name扩展.

java ssl https certificate

5
推荐指数
0
解决办法
5226
查看次数

使用jks文件访问https服务的java过程

  1. 使用JKS文件调用远程Web服务的Java代码.
  2. 如何使用证书访问授权服务.并添加请定义java密钥库.我是非常新的这些过程.我在尝试与此相关时遇到以下错误

    cause javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
    PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
    
    Run Code Online (Sandbox Code Playgroud)

我在最后一个月挣扎.请任何人做必要的.原谅我语法错误.

java jks

3
推荐指数
1
解决办法
3125
查看次数

JAXWS客户端使用X509服务器身份验证调用JAXWS Webservice

我使用wsdlc ANT任务从wsdl创建了一个JAXWS Web服务,并部署在Weblogic 10.3.0中.我们有Sun one Java Server 7.0,其中安装了Verisign Server证书并配置为将webservice请求转发到weblogic.

我使用wsimport ant任务创建了一个JAXWS客户端来调用webservice.使用https URL运行客户端时,我可以看到weblogic中的xml请求,并成功处理了webservice.但我无法在xml请求/响应中找到任何x509证书的证据.除了使用wsimport生成存根之外,我是否需要在客户端执行任何操作?通过浏览器查看wsdl时,我可以通过浏览器查看证书详细信息.

jax-ws

0
推荐指数
1
解决办法
1万
查看次数