Desidero recuperare il certificato del server pubblico inviato di un Microsoft SQL Server (2012/2014) durante l'handshake SSL/TLS utilizzando la mia applicazione Java.Recupera chiave certificato server pubblico durante l'handshake
Il mio ambiente prima:
- MS SQL è configurato per utilizzare la crittografia forza
- accetta solo connessione SSL/TLS
- ha tra l'altro una CA autofirmato e un certificato rilasciato da detto CA
- certificato rilasciato è utilizzato dal server MS SQL
per realizzare questo programma maticamente Sto usando la mia implementazione del gestore di fiducia. Si prega di consultare l'estratto del relativo codice qui:
SSLSocket sslSocket = (SSLSocket) getFactory().createSocket(socket, host, port, true);
sslSocket.startHandshake();
getFactory():
private SSLSocketFactory getFactory() throws IOException
{
// irrelevant code removed here
return factory();
}
fabbrica():
private static SSLSocketFactory factory() throws NoSuchAlgorithmException, KeyManagementException
{
SSLSocketFactory factorySingleton;
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, getTrustManager(), null);
factorySingleton = ctx.getSocketFactory();
return factorySingleton;
}
getTrustManager():
private static TrustManager[] getTrustManager()
{
X509Certificate[] server = null;
X509Certificate[] client = null;
X509TrustManager tm = new X509TrustManager()
{
X509Certificate[] server1 = null;
X509Certificate[] client1 = null;
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[0];
}
public void checkServerTrusted(X509Certificate[] chain, String x)
{
server1 = chain;
Logger.println("X509 Certificate chain: " + chain);
}
public void checkClientTrusted(X509Certificate[] chain, String x)
{
client1 = chain;
Logger.println("X509 Certificate chain: " + chain);
}
};
return new X509TrustManager[]{tm};
}
Mi aspettavo che la chiamata a startHandshake()
a un certo punto renderebbe la mia applicazione ricevere i diversi certificati dal mio server SQL e nel tentativo di verificarli chiamano il mio gestore di fiducia personalizzato. A questo punto avrei i certificati (catena X509Certificate []). Ma il mio gestore di fiducia non viene chiamato o almeno i punti di interruzione all'interno di entrambi i metodi di controllo non vengono chiamati.
Questo è uno dei documenti MS che ho usato come riferimento: https://msdn.microsoft.com/en-us/library/bb879919(v=sql.110).aspx#Anchor_1
"Durante handshake SSL, il server invia il suo certificato di chiave pubblica al cliente." < --- esattamente quello che voglio/ho bisogno.
Questo dovrebbe funzionare esattamente come previsto. Forse lo ssl-handshake o la connessione tcp falliscono già? – Ctx
Non credo perché posso vedere la stretta di mano che si verifica con l'opzione di debug di jvm e se esporto manualmente il certificato del server e lo metto sulla mia macchina in un trust store e lo utilizzo per la connessione ssl. – sceiler
Forse c'è qualcosa di sbagliato nella registrazione? Ho testato il codice (usando System.out.println) e l'output di debug è apparso come previsto – Ctx