2012-04-04 25 views
0

私はクライアントとサーバーを同じキーストアで接続しようとしています。 クライアントソケットはピア証明書を取得できますが、サーバーソケットはピア証明書を取得できませんが、ポートは取得できません。 証明書の取得に失敗し、SSLPeerUnverifiedExceptionの異常が報告されました。SSLPeerUnverifiedExceptionサーバーのクライアントの証明書なし

クライアント:

java.security.Security.addProvider(
     new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

SSLContext sslcontext = SSLContext.getInstance("TLS"); 
      sslcontext.init(getKeyManagers(), {new DummyTrustManager()}, null); 
SocketFactory socketFactory = sslcontext.getSocketFactory(); 

SSLSocket socket = (SSLSocket) socketFactory.createSocket("127.0.0.1", 8080); 
socket.getSession().getLocalCertificates(); 
socket.getSession().getPeerHost(); 
socket.getSession().getPeerPort(); 
socket.getSession().getPeerCertificates();` 

サーバー:

SSLContext sslcontext = SSLContext.getInstance("TLS"); 
    sslcontext.init(getKeyManagers(), {new DummyTrustManager()}, null); 
ServerSocketFactory mFactory = sslcontext.getServerSocketFactory(); 
ServerSocket serverSocket =mFactory.createServerSocket(8080); 
SSLSocket clientSocket = serverSocket.accept(); 
socket.getSession().getLocalCertificates(); 
socket.getSession().getPeerHost(); 
socket.getSession().getPeerPort(); 
socket.getSession().getPeerCertificates();` 

のTrustManager: 修正の問題は、次のように私のアンドロイドのコードがあるおかげ

、plsはそれを解決するのに役立ち、数日私を混同しました

import java.security.cert.X509Certificate; 
import javax.net.ssl.X509TrustManager; 
public class DummyTrustManager implements X509TrustManager { 
    public void checkClientTrusted(X509Certificate[] chain, String authType) { 
    // Does not throw CertificateException: all chains trusted 
    return; 
    } 
    public void checkServerTrusted(X509Certificate[] chain, String authType) { 
    // Does not throw CertificateException: all chains trusted 
    return; 
    } 
    public X509Certificate[] getAcceptedIssuers() { 
    return new X509Certificate[0]; 
    } 
} 

キーストア:

public void initializeKeyStore(String id) { 
try { 
    Log.v(LOG_TAG, "Generating key pair ..."); 
    KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA"); 
    KeyPair keyPair = kg.generateKeyPair(); 


    Log.v(LOG_TAG, "Generating certificate ..."); 
    String name = getCertificateName(id); 
    X509Certificate cert = SslUtil.generateX509V3Certificate(keyPair, name); 
    Certificate[] chain = {cert}; 


    Log.v(LOG_TAG, "Adding key to keystore ..."); 
    mKeyStore.setKeyEntry(
     LOCAL_IDENTITY_ALIAS, keyPair.getPrivate(), null, chain); 


    Log.d(LOG_TAG, "Key added!"); 
} catch (GeneralSecurityException e) { 
    throw new IllegalStateException("Unable to create identity KeyStore", e); 
} 
store(mKeyStore);} 




public synchronized KeyManager[] getKeyManagers() 
    throws GeneralSecurityException { 
if (mKeyStore == null) { 
    throw new NullPointerException("null mKeyStore"); 
} 
KeyManagerFactory factory = 
    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
factory.init(mKeyStore, "".toCharArray()); 
return factory.getKeyManagers(); 

}

CERT:

public static X509Certificate generateX509V3Certificate(KeyPair pair, 
    String name) throws GeneralSecurityException { 
Calendar calendar = Calendar.getInstance(); 
calendar.set(2009, 0, 1); 
Date notBefore = new Date(calendar.getTimeInMillis()); 
calendar.set(2099, 0, 1); 
Date notAfter = new Date(calendar.getTimeInMillis()); 

BigInteger serialNumber = BigInteger.valueOf(Math.abs(
    System.currentTimeMillis())); 

return generateX509V3Certificate(pair, name, notBefore, notAfter, 
    serialNumber); 

}

public static X509Certificate generateX509V3Certificate(KeyPair pair, 
    String name, Date notBefore, Date notAfter, BigInteger serialNumber) 
    throws GeneralSecurityException { 
java.security.Security.addProvider(
    new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); 
X509Name dnName = new X509Name(name); 

certGen.setSerialNumber(serialNumber); 
certGen.setIssuerDN(dnName); 
certGen.setSubjectDN(dnName); // note: same as issuer 
certGen.setNotBefore(notBefore); 
certGen.setNotAfter(notAfter); 
certGen.setPublicKey(pair.getPublic()); 
certGen.setSignatureAlgorithm("SHA256WithRSAEncryption"); 


certGen.addExtension(X509Extensions.BasicConstraints, true, 
    new BasicConstraints(false)); 

certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature 
    | KeyUsage.keyEncipherment | KeyUsage.keyCertSign)); 
certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(
    KeyPurposeId.id_kp_serverAuth)); 


AuthorityKeyIdentifier authIdentifier = createAuthorityKeyIdentifier(
    pair.getPublic(), dnName, serialNumber); 

certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, true, 
    authIdentifier); 
certGen.addExtension(X509Extensions.SubjectKeyIdentifier, true, 
    new SubjectKeyIdentifierStructure(pair.getPublic())); 


certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(
    new GeneralName(GeneralName.rfc822Name, "[email protected]"))); 


// This method is deprecated, but Android Eclair does not provide the 
// generate() methods. 
X509Certificate cert = certGen.generateX509Certificate(pair.getPrivate(), "BC"); 
return cert; 

}

enter code here 

答えて

0

サーバー側にクライアント認証が必要な場合は、おそらくSSLServerSocket.setNeedClientAuth()に電話する必要があります。クライアントはその証明書を送信し、getPeerCertificates()で取得できます。

参考:唯一の有効なことだ

http://docs.oracle.com/javase/6/docs/api/javax/net/ssl/SSLServerSocket.html#setNeedClientAuth%28boolean%29

+0

大丈夫、試してみます。しかし、私はSSLServerSocket.setNeedClientAuth()の呼び出しを思い出しました。 – user1312018

+0

申し訳ありませんが、返信が遅すぎます。それはアンドロイド2.2ではなく、android2.3とandroid 2.4で正常に動作します。私はそれを辿り、それがopensslの何かに間違っているかもしれないことを発見した。どのように私はそれを解決することができます。 – user1312018

+0

ファームウェアのバグであれば、本当にできません。なぜあなたはそれがopensslに問題があると思いますか? –

0

I'm trying to connect client and server with the same keystore

はそれをクライアントエンティティとサーバエンティティを行うには、実際には同じ法人です。

もしそうでなければ、間違った法律的影響を与える方法で間違ったツリーを完全に吠えていることになります。私は続ける前にビジネス/法的側面からアドバイスを求めることをお勧めします。

関連する問題