Client Certificate not working from Android - How to debug?

后端 未结 1 1147
野趣味
野趣味 2020-12-20 04:50

I\'m trying to implement a Client Certificates communication for an Android App, so far without much success - and it seems that this feature is, if at all possible, very ha

相关标签:
1条回答
  • 2020-12-20 05:24

    It's not good answer, but there is too much in here to post it as comment.

    For logging, debugging you can create your own X509KeyManager which uses normal key manager obtained from KeyManagerFactory:

    @DebugLog annotation comes from Hugo library created by Jake Wharton. It prints function arguments and what it return. You can use normal Log.d or whatever you want.

    ex:

    class MyKeyManager implements X509KeyManager {
    
        private final X509KeyManager keyManager;
    
        MyKeyManager(X509KeyManager keyManager) {
            this.keyManager = keyManager;
        }
    
        @DebugLog
        @Override
        public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket) {
            return this.keyManager.chooseClientAlias(strings, principals, socket);
        }
    
        @DebugLog
        @Override
        public String chooseServerAlias(String s, Principal[] principals, Socket socket) {
            return keyManager.chooseServerAlias(s, principals, socket);
        }
    
        @DebugLog
        @Override
        public X509Certificate[] getCertificateChain(String s) {
            return keyManager.getCertificateChain(s);
        }
    
        @DebugLog
        @Override
        public String[] getClientAliases(String s, Principal[] principals) {
            return keyManager.getClientAliases(s, principals);
        }
    
        @DebugLog
        @Override
        public String[] getServerAliases(String s, Principal[] principals) {
            return keyManager.getServerAliases(s, principals);
        }
    
        @DebugLog
        @Override
        public PrivateKey getPrivateKey(String s) {
            return keyManager.getPrivateKey(s);
        }
    }
    

    And use it to init SSLContext

    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(keyStore, password);
    
    final X509KeyManager origKm = (X509KeyManager) kmf.getKeyManagers()[0];
    X509KeyManager km = new MyKeyManager(origKm);
    
    SSLContext sslCtx = SSLContext.getInstance("TLS");
    sslCtx.init(new KeyManager[]{km}, tmf.getTrustManagers(), null);
    

    You will see which method are called, what are the arguments (obtained from serwer certificate) and which certificate and private key your keymanager returns.

    0 讨论(0)
提交回复
热议问题