Díky,
myslím, že si rozumíme a sám jsem si u zákazníka ověřoval tuto skutečnost a
jedná se o ten symetrický klíč použitý při handshake. Tento příklad s
vlastním TrustManagerem jsem totiž objevil dávno a málem jásal :-(
ještě je tu jistá možnost, že si pojmy s dojmy plete zákazník - pak mi ale
nezbývá než se naučit Norsky a hledat v materiálech NSA sám :-(
On Tuesday 04 of December 2007 12:57:18 Martin Kuba wrote:
> Pírko, Jiří Mikulášek napsal(a):
> > Hezký den,
> > na našeho zákazníka jsou kladeny požadavky (dané národním bezpečnostním
> > úřadem) na zajištění minimálně 2048-bitového klíče při algoritmu pro
> > výměnu klíčů během SSL handshake (algorithm and key negotiation). Ať
> > pátrám jak pátrám nenacházím možnost jak toto v JSSE ovlinit.
> >
> > Mohl by mě prosím někdo nasměrovat?
>
> Abychom si rozuměli - při SSL handshake se dohodne *symetrická
> šifra*, kde délky klíče bývají kolem 50 až 256 bitů. Při
> handshake si strany vymění certifikáty, v nichž jsou
> veřejné klíče pro *asymetrickou šifru* a ty bývají
> délky 1024 nebo 2048 bitů.
>
> Z délky klíče tedy odhaduji, že máte na mysli délku klíče
> v certifikátu. Tu ověříte snadno vlastní implementací
> javax.net.ssl.X509TrustManager, tj. zhruba:
>
> static class MujX509TrustManager implements X509TrustManager {
> public X509Certificate[] getAcceptedIssuers() {
> throw new RuntimeException("not implemented");
> }
>
> public void checkClientTrusted(X509Certificate[] certs, String
> authType) { throw new RuntimeException("not implemented");
> }
>
> public void checkServerTrusted(X509Certificate[] certs, String
> authType) throws CertificateException { PublicKey publicKey =
> certs[0].getPublicKey();
> if (publicKey.getAlgorithm().equals("RSA")) {
> RSAPublicKey rsa = (RSAPublicKey) publicKey;
> if (rsa.getModulus().bitLength() < 2048) throw new
> CertificateException("RSA key too short"); } else if
> (publicKey.getAlgorithm().equals("DSA")) {
> DSAPublicKey dsa = (DSAPublicKey) publicKey;
> if(dsa.getY().bitLength() < 2048) throw new
> CertificateException("DSA key too short"); } else {
> throw new CertificateException(publicKey.getAlgorithm()+"
> key not known"); }
> }
> }
>
> a nainstalovat:
>
> TrustManager[] moje = new TrustManager[]{new MujX509TrustManager()};
> SSLContext sctx = SSLContext.getInstance("SSL");
> sctx.init(null, moje, null);
> SSLSocketFactory factory = sctx.getSocketFactory();
>
> Ten kód výše jenom kontroluje počet bitů klíče, neoveřuje certifikát,
> takže ho budete muset upravit. A je to jenom pro klienta ověřujícího
> server. Pro server ověřující klienta musíte udělat totéž v metodě
> checkClientTrusted().
>
>
> Makub