프로그램 SSL 알고리즘의 제약을 휴식

실비 G :

문제

나는 SSL 소켓을 통해 로컬 서버에 연결을 시도하고있다. 서버가 SSL 인증서 것을 사용합니다

  1. 자체 서명입니다.
  2. MD5withRSA가 서명을 가지고 (?)

나는 보안 의미를 알고,하지만 내 통제 할 수없는 이유로, 나는 변경하거나 변경 요청이 인증서에 따라서 내가 일을 강요하고 그것으로 할 수 - 주위, 또는 오히려.

위의 두 점을 극복하기 위해, 내가 만든 :

  1. A는 TrustManager모든 인증서를 허용하는.
  2. AlgorithmConstraints모든 알고리즘을 허용하는.

나는 다음과 같은 오류와 끝까지 :

Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on signature algorithm: MD5withRSA

이 알고리즘의 제약을 휴식에 나의 접근 방식은 결함이 보인다.

참고 : 나는 그 것을 알고 MD5withRSA알고리즘은 JVM 구성 또는 명령 줄 매개 변수를 변경을 통해 허용 될 수 있지만이 프로그램이 작업을 수행해야합니다.

코드

TrustManager다음과 같이 만들었습니다 :

TrustManager[] trustManager = new TrustManager[] { 
    new X509TrustManager() {     
        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        @Override
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        @Override
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
};

AlgorithmConstraints다음과 같이 만들었습니다 :

AlgorithmConstraints algorithmConstraints = new AlgorithmConstraints() {
    @Override
    public boolean permits(Set<CryptoPrimitive> primitives, String algorithm, AlgorithmParameters parameters) {
        return true;
    }

    @Override
    public boolean permits(Set<CryptoPrimitive> primitives, Key key) {
        return true;
    }

    @Override
    public boolean permits(Set<CryptoPrimitive> primitives, String algorithm, Key key, AlgorithmParameters parameters) {
        return true;
    }
}

다음과 같이 그리고 마지막으로, 소켓 코드는 다음과 같습니다

SSLContext sslContext = SSLContext.getInstance("TLS"); 

sslContext.init(null, trustManager, new java.security.SecureRandom());

SSLSocketFactory factory = sslContext.getSocketFactory();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(server, port);

SSLParameters sslParameters = new SSLParameters();
sslParameters.setAlgorithmConstraints(algorithmConstraints);

sslsocket.setSSLParameters(sslParameters);

sslSocket.startHandshake();

제안?

실비 G :

해결책

언급 한 바와 같이 이 대답에 , 하나는 사용할 필요가 X509ExtendedTrustManager대신을 X509TrustManager. 이것은 또한 사용자 지정의 필요성 부정 AlgorithmConstraints제가 질문했던 것처럼, 구현.

경고

발견 누구든지 /이 솔루션을 사용한다 :

참고 표준 인증 검사를 우회하면 접속을 노출 (및 확장 응용 프로그램) 사소한 어느 것도 보안 위험의 수 있다고!

적어도 구현해야합니다 일부 와 같은 추가 보안 검사를 고정 인증서 확인 응용 프로그램이 신뢰할 수있는 환경에서 사용되는 것을 적어도 100 %, 또는!

추천

출처http://43.154.161.224:23101/article/api/json?id=188291&siteId=1