Използвам Netty на Android и от страната на сървъра, за да установя защитена с SSL връзка с удостоверяване на клиента. Сега имам затруднения при свързването с тези сертификати, тъй като SSLEngine ги отхвърля поради "нулева верига от сертификати".
Това е, което направих от страната на сървъра. Настроих SSLContext с подписан сървърен сертификат (клиентът знае CA, така че може да потвърди този).
За да накарам сървъра да приема всякакви сертификати от клиенти (тъй като всички те са самоподписани), внедрих DummyTrustManager, който просто ще приеме всички.
private static class DummyTrustManager implements X509TrustManager
{
private X509Certificate[] mCerts;
public DummyTrustManager(Certificate[] pCerts)
{
// convert into x509 array
mCerts = new X509Certificate[pCerts.length];
for(int i = 0; i < pCerts.length; i++)
{
mCerts[i] = (X509Certificate)pCerts[i];
}
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException{}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException{}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return mCerts;
//return new X509Certificate[0];
}
}
Въпросът е, че не съм съвсем сигурен за метода getAcceptedIssuers().
Ако върна празен масив, двоичният файл openssl (който използвам за проверка на правилната настройка) се проваля поради празен списък AcceptedIssuers.
Ако добавя веригата сертификати на текущия сървър, тя ще работи поне за клиентски сертификати, които са подписани от същия ca, но не и с такива, които са самоподписани (от което се нуждая).
Но може би правя нещо нередно от страна на клиента:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
keyStore.setEntry("user_certificate", new KeyStore.PrivateKeyEntry(mPrivate, new Certificate[]{mClientCert}), this);
keyStore.setCertificateEntry("server_certificate", mServerCert);
Също така направих някои проучвания и от това, което разбрах досега: Клиентът има валидна верига от сертификати, но не го изпраща, защото сървърът му казва, че приема само издателите, изброени от сървъра.
Ако това е правилно, тогава как мога да преодолея този проблем?
Мислех за отделен самоподписан CA, който се доставя на всички клиенти и който също е посочен в списъка на приетите от сървъра издатели. Всеки клиент използва този CA, за да подпише свой собствен сертификат. Не виждам проблем със сигурността в това. Или има по-добро решение?