web-dev-qa-db-ja.com

javax.net.ssl.SSLException:<>の証明書がサブジェクト代替名のいずれとも一致しません:[]

Postmanを使用してURLをヒットしようとすると、個人証明書を使用して正常に機能しますが、Rest Assuredテストケースを使用して同じことを試みた場合、上記の例外がスローされます。

構成クラス

public class Configuration {

    protected SSLConfig config = null;
    private static final Logger LOG = LoggerFactory.getLogger(Configuration.class);

    @SuppressWarnings("deprecation")
    @BeforeClass
    public void setKeystore()

    {
        KeyStore keyStore = null;

        KeyStore trustStore = null;
        try {
            String certPassword = System.getProperty("certPassword");
            String certPath = System.getProperty("certPath");

            String trustStorePassword = System.getProperty("trustStorePassword");
            String trustStorePath = System.getProperty("trustStorePath");
            Validate.notNull(certPath, "Path to Certificate on the file system cannot be null");
            Validate.notEmpty(certPassword, "Password cannot be empty");
            Validate.notNull(trustStorePath, "Path to trustStore on the file system cannot be null");
            Validate.notEmpty(trustStorePassword, "TrustStore Password cannot be empty");

            keyStore = KeyStore.getInstance("JKS");
            keyStore.load(new FileInputStream(certPath), certPassword.toCharArray());
            trustStore = KeyStore.getInstance("JKS");
            trustStore.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray());

            if (keyStore != null) {

                org.Apache.http.conn.ssl.SSLSocketFactory clientAuthFactory = new org.Apache.http.conn.ssl.SSLSocketFactory(
                        keyStore, certPassword, trustStore);
                config = new SSLConfig().with().sslSocketFactory(clientAuthFactory).and().allowAllHostnames();

            }
            EnvironmentConstants.getEnvironment();

        } catch (Exception e) {
            LOG.error("Error while loading keystore");
            e.printStackTrace();
        }
    }

    @BeforeTest
    public Properties loadproperties() {

        InputStream input = getClass().getClassLoader().getResourceAsStream("errorMessages.properties");
        Properties properties = new Properties();
        try {
            properties.load(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }

}
6
Rocky4Ever

この問題は、当社が新しいサーバーを構成したが、サーバー証明書にDNSが含まれていなかったためです。そのため、私の会社は証明書にサーバー名を含めています。現在は機能しています。

4
Rocky4Ever

RFC 2818(HTTPS仕様) によると:

ホスト名が使用可能な場合、クライアントは、man-in-the-middle攻撃を防ぐために、サーバーの証明書メッセージに示されているサーバーのIDと照合する必要があります...タイプdNSNameのsubjectAltName拡張が存在する場合、それはMUSTです。アイデンティティとして使用されます。それ以外の場合は、証明書のサブジェクトフィールドの(最も具体的な)共通名フィールドを使用する必要があります。共通名の使用は既存の慣行ですが、非推奨であり、認証局は代わりにdNSNameを使用することをお勧めします。

証明書の使用を計画しているすべてのホスト名を含むSAN拡張子を持つ証明書を生成する必要があります:

keytool -genkeypair \
    -keystore server-keystore.pkcs12 \
    -deststoretype pkcs12 \
    -dname "CN=mydomain.local" \
    -keypass changeit \
    -storepass changeit \
    -keyalg RSA \
    -validity 1825 \
    -keysize 4096 \
    -alias mydomain.local \
    -ext SAN=dns:mydomain.local,dns:mydomain.dev,dns:mydomain.test,dns:localhost
1