相关疑难解决方法(0)

如何从Java中的X509Certificate中提取CN?

我正在使用SslServerSocket和客户端证书,并希望从客户端的SubjectDN中提取CN X509Certificate.

我打电话的那一刻,cert.getSubjectX500Principal().getName()但这当然给了我客户端的格式化DN.出于某种原因,我只对CN=theclientDN 的部分感兴趣.有没有办法提取DN的这一部分而不自己解析String?

java ssl x509certificate x509

82
推荐指数
8
解决办法
7万
查看次数

使用JSSE时如何进行主机名验证?

我正在编写一个Java客户端(需要在桌面JRE和Android上工作),以获得通过TLS承载的专有协议(特定于我的公司).我试图找出用Java编写TLS客户端的最佳方法,特别是确保它正确地进行主机名验证.(编辑:通过它,我的意思是检查主机名是否与X.509证书匹配,以避免中间人攻击.)

JSSE是编写TLS客户端的明显API,但我从" 世界上最危险的代码 "论文(以及实验)中注意到,JSSE在使用SSLSocketFactory API时不验证主机名.(这是我必须使用的,因为我的协议不是HTTPS.)

因此,似乎在使用JSSE时,我必须自己进行主机名验证.而且,而不是从头开始编写代码(因为我几乎肯定会弄错),似乎我应该"借用"一些有效的现有代码.所以,我发现的最有可能的候选者是使用Apache HttpComponents库(具有讽刺意味,因为我实际上并不在做HTTP)并使用org.apache.http.conn.ssl.SSLSocketFactory类代替标准的javax .net.ssl.SSLSocketFactory类.

我的问题是:这是一个合理的行动方案吗?或者我完全误解了事情,走出了深层,实际上有一种更简单的方法来获取JSSE中的主机名验证,而不需要像HttpComponents那样引入第三方库?

我也看过BouncyCastle,它有一个非JSSE的TLS API,但它似乎更有限,因为它甚至不进行证书链验证,更不用说主机名验证,所以它看起来像一个非-起动机.

编辑:这个问题已经回答了Java 7,但我仍然很好奇Java 6和Android的"最佳实践"是什么.(特别是,我必须为我的应用程序支持Android.)

再次编辑:为了使我的"借用Apache HttpComponents"更具体,我创建了一个小型库,其中包含从Apache HttpComponents中提取的HostnameVerifier实现(最值得注意的是StrictHostnameVerifier和BrowserCompatHostnameVerifier).(我意识到我需要的只是验证器,我不需要像我原先想的那样使用Apache的SSLSocketFactory.)如果留给我自己的设备,这就是我将使用的解决方案.但首先,我有什么理由这样做吗?(假设我的目标是以与https相同的方式进行主机名验证.我意识到它本身可以辩论,并且已经在加密列表的线程中进行了讨论,但是现在我坚持使用类似HTTPS的主机名验证,即使我没有使用HTTPS.)

假设我的解决方案没有"错误",我的问题是:有没有"更好"的方法来实现它,同时仍然可以在Java 6,Java 7和Android上保持可移植性?("更好"意味着更惯用,已经广泛使用,和/或需要更少的外部代码.)

java ssl jsse

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

如果我在Android中使用SSLSocket并且硬编码源代码中的信任库的密码是不安全的?

我正在使用java的SSLSocket将android应用程序安全地连接到服务器.证书位于信任库中.但是信任库的密码似乎是连接所必需的,因此它当前被硬编码到设备中.我对PKI知之甚少,但这似乎并不安全.我将信任库与原始资源文件夹中的应用程序捆绑在一起.有没有更好的方法来安全地允许应用程序使用TLS连接到服务器?我对TLS/SSL非常新,所以我将不胜感激任何帮助或建议.

这是代码的客户端.

        store = KeyStore.getInstance("BKS"); 
        InputStream in = appcontext.getResources().openRawResource(R.raw.truststore);
        store.load(in, "PASSWORD".toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        tmf.init(store);
        sslcontext = SSLContext.getInstance("TLS");
        sslcontext.init(null, tmf.getTrustManagers(), new SecureRandom());

        SSLSocketFactory sslsocketfactory = sslcontext.getSocketFactory();

        // connect to socket
        SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
                "192.168.1.16", 9999);
Run Code Online (Sandbox Code Playgroud)

java encryption ssl android

4
推荐指数
1
解决办法
1058
查看次数

标签 统计

java ×3

ssl ×3

android ×1

encryption ×1

jsse ×1

x509 ×1

x509certificate ×1