我是这个SSL和X509CertificateConcept的新手.我需要的是,有没有办法从给定的证书信息中获取Url
例如:如果用户键入了https://www.google.com,那么我需要以编程方式获取证书信息.
编辑:
最后,我从服务器获得了证书信息.
现在,我的问题是:
1.如何检查证书是否可信?
2.如何将证书添加到信任管理器?
3.即使是不可信证书,如果用户想继续使用,那么我需要将证书添加到信任管理器.我怎样才能实现这一目标?
4.为了检查证书是否可信,我们真的需要另外一个证书进行比较吗?
我对这些非常陌生 X.509 Certificate.
任何帮助都会得到真正的赞赏.
编辑:
这就是我所尝试的.但是,他们都没有帮助我.我需要获得证书是否可信.
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
for (TrustManager tm : managers) {
if (tm instanceof X509TrustManager) {
((X509TrustManager) tm).checkClientTrusted(
chain, authType);
}
}
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) {
for (X509Certificate cert : chain) {
final String …Run Code Online (Sandbox Code Playgroud) Android应用程序有三个主机进行身份验证和授权.最终主机是REST API.第一次使用Oauth身份验证和授权过程,它没有问题.
但是,如果用户在登录后杀死应用程序并访问REST API提供的服务,然后再次打开应用程序,则会出现此问题.在这种情况下,身份验证和授权过程不会发生,只有REST API.它导致java.security.cert.CertPathValidatorException 但它在第一次使用时工作(登录然后使用应用程序).
有人可以解释这个异常背后的情况,并且该应用程序有什么问题.如果根据此SO答案忽略认证例外,则此方法有效.
SSLSocketFactory sslSocketFactory = null;
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
try {
tmf.init((KeyStore)null);
} catch(KeyStoreException e) {
e.printStackTrace();
}
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
// Create a trust manager that does not validate certificate chains
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用内置类com.sun.net.httpserver.HttpsServer在Java(6)中构建自定义HTTPS服务器.它工作正常,直到我需要客户端身份验证 此时,它在服务器上的SSL调试中失败并出现以下异常.
sun.security.validator.ValidatorException:Netscape证书类型不允许用于SSL客户端
我使用的是内部CA颁发的证书,用于我们内部的所有应用程序.我查看了证书详细信息,发现该类型是"SSL Server"(详情请参阅下文).由于我们的政策是对所有内部应用程序使用"SSL服务器"类型,因此很难更改证书.由于我想为客户端使用服务器证书,我不认为这是一个安全问题.
我正在寻找的方法是在Java中禁用此约束检查.有谁遇到过这个并解决了这个问题?任何帮助都非常感谢.
最诚挚的问候,阿伦
Owner: CN=myapp, OU=mygroup, O=mycompany
Issuer: O=MYCA
Serial number: 4cc8c1da
Valid from: Mon Jan 10 13:46:34 EST 2011 until: Thu Jan 10 14:16:34 EST 2013
Certificate fingerprints:
MD5: 8C:84:7F:7A:40:23:F1:B5:81:CD:F9:0C:27:16:69:5E
SHA1: 9B:39:0B:2F:61:83:52:93:D5:58:E5:43:13:7A:8F:E1:FD:AC:98:A4
Signature algorithm name: SHA1withRSA
Version: 3
Extensions:
[1]: ObjectId: 2.5.29.16 Criticality=false
PrivateKeyUsage: [
From: Mon Jan 10 13:46:34 EST 2011, To: Wed Jul 11 21:16:34 EDT 2012]
[2]: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
DigitalSignature
Key_Encipherment
]
[3]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier …Run Code Online (Sandbox Code Playgroud) 我试图覆盖Android中的信任管理器。我想让基础信任管理器检查证书,但是我需要确定证书是否过期。如果证书已过期,我需要忽略它并接受证书。如果取出电池,某些移动设备会将日期重置为旧日期,从而导致证书看起来好像过期了。即使发生这种情况,我的应用也必须继续保持运行状态。
我遇到的问题是,此行代码引发NullPointerException:
origTrustmanager.checkServerTrusted(certs, authType);
Run Code Online (Sandbox Code Playgroud)
根据文档,checkServerTrusted绝不应抛出NullPointerExeption。certs有两个项目。authType设置为“ RSA”。如果我没有实现自定义的信任管理器,则会抛出一个异常,该异常清楚地表明证书已过期,因此我知道底层的信任管理器正在执行其工作。即使我将设备上的日期和时间设置在证书的有效期内,上面的checkServerTrusted行也会生成异常。为什么?显然我做错了。这是我的自定义信任管理器的代码以及如何访问Url:
class SSLTrustManager
{
private X509TrustManager origTrustmanager;
public SSLTrustManager()
{
try
{
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
TrustManager[] trustManagers = tmf.getTrustManagers();
this.origTrustmanager = (X509TrustManager) trustManagers[0];
}
catch (Exception ex)
{
}
}
public javax.net.ssl.SSLSocketFactory GetSocketFactory()
{
try
{
TrustManager[] wrappedTrustManagers = new TrustManager[] {
new X509TrustManager()
{
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return origTrustmanager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
{
try
{
origTrustmanager.checkClientTrusted(certs, authType);
}
catch (CertificateException e)
{
}
}
public void …Run Code Online (Sandbox Code Playgroud) 我想做的事情很简单 - 我想在从 iOS 和 Android 应用程序连接到服务器时获得完整的证书链。
在 iOS 中,我正在使用NSURLSession和覆盖URLSession:didReceiveChallenge:方法,在该方法中我能够获取证书链,在这种情况下,它看起来像预期的那样:
[leaf certificate] - [intermediate certificate] - [root certificate]
迷人的。
现在我正在尝试在 Android 设备上使用HttpsURLConnection. 连接到服务器后,我正在使用方法获取证书链(或者至少我希望这是它的getServerCertificates()方法)。这将返回我的Certificate[]对象,我在其中获得了如下所示的链:
[leaf certificate] - [intermediate certificate]
因此,Android 设备上没有根证书。
您知道如何从Android中的链中获取根证书吗?
先感谢您。