0

ノンブロッキング TLS 通信にSSLEnginewithを使用しています。NIO

エンジンは正常に動作しており、サーバー証明書の有効期間である CA 信頼を検証できます。

しかし、私が見逃しているのは、証明書のサブジェクト名が接続先のサーバー名と一致することの検証です。

サブジェクト代替名などのすべての SSL 拡張機能を考慮して、それを実装する最良の方法は何ですか?

サブジェクト名を簡単に確認しようとしましたが、でも機能しませんgoogle.nl。証明書のサブジェクトはgoogle.comでありgoogle.nl、代替名拡張子でのみ見つかります。

4

1 に答える 1

0

もう一度自分の質問に答えるつもりです...

ここまで来ることができました。Sun JSSE 実装に限定されます。これが完全な解決策であるかどうかはわかりません。

void checkServerName(String serverName, SSLSession session) throws IOException {
    String name;
    boolean matches = false;
    X509CertImpl cert = (X509CertImpl)session.getPeerCertificates()[0];
    SubjectAlternativeNameExtension altNames = cert.getSubjectAlternativeNameExtension();
    if (altNames != null) {
        GeneralNames names = (GeneralNames) altNames.get(SubjectAlternativeNameExtension.SUBJECT_NAME);
        for (GeneralName genName : names.names()) {
            switch (genName.getType()) {
                case GeneralNameInterface.NAME_DNS:
                    name = ((DNSName)genName.getName()).getName();
                    break;
                case GeneralNameInterface.NAME_IP:
                    name = ((IPAddressName)genName.getName()).getName();
                    break;
                case GeneralNameInterface.NAME_RFC822:
                    name = ((RFC822Name)genName.getName()).getName();
                    break;
                case GeneralNameInterface.NAME_ANY:
                    DerValue derValue = new DerValue(((OtherName)genName.getName()).getNameValue()); 
                    name = derValue.getData().getUTF8String();
                    break;
                default:
                    continue;
            }
            if (name.startsWith("*"))
                matches |= serverName.endsWith(name.substring(1).toLowerCase());
            else
                matches |= serverName.equals(name.toLowerCase());
            if (matches)
                break;
        }
    }
    name = ((X500Name)cert.getSubjectDN()).getCommonName();
    if (!matches)
        matches = serverName.equals(name.toLowerCase());
    if (!matches)
        throw new SSLPeerUnverifiedException("server name mismatch, certificate issued to: " + name);
}
于 2012-07-16T12:34:45.777 に答える