복붙노트

[SPRING] 예외는 봄 MVC에서 대상의 인증서를 확인할 수 없습니다.

SPRING

예외는 봄 MVC에서 대상의 인증서를 확인할 수 없습니다.

내 사용자 이름과 비밀 번호를 사용하여 jira 서버에서 문제를 세부 정보를 얻으려고 노력하고 있지만 인증서를 확인할 수 없다는 ssl 오류가 나타납니다.

인증서를 확인하는 방법

url : http : local / 8080 / frr / hello

오류 받기 :

내 Service.class 코드

@Controller
public class Service{


    @RequestMapping("/hello")


     public String Data(ModelMap model){

        RestTemplate restTemplate = new RestTemplate();

        ResponseEntity<String> result = restTemplate.exchange("https://jira.example.com/rest/api/2/issue/id",  HttpMethod.GET, new HttpEntity<String>(createHeaders("username", "password")), String.class);

        model.addAttribute("message", result);


        return "helloworld";
    }

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders createHeaders( String username, String password ){
        HttpHeaders header =  new HttpHeaders();
        String auth = username + ":" + password;
        byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")) );
        String base64Creds = "Basic " + new String( encodedAuth );
        header.add("Authorization", "Basic " + base64Creds);
        return header;
    }   
}

해결법

  1. ==============================

    1.현재 직면 한 문제는 응용 프로그램이 인증서를 신뢰할 수 없으므로 연결하려는 외부 서버의 유효성을 검사 할 수 없다는 것입니다.

    현재 직면 한 문제는 응용 프로그램이 인증서를 신뢰할 수 없으므로 연결하려는 외부 서버의 유효성을 검사 할 수 없다는 것입니다.

    간단히 설명하면 다음과 같습니다.

    이 Jira 인스턴스가 사내 (회사에서 호스팅) 인 경우 자체 서명 된 인증서를 갖는 것이 거의 불가능합니다. 이 경우 인증서는 알려진 CA에서 발급하지 않으므로 인증서를 신뢰하려면 수동으로 등록해야합니다.

    먼저 인증서를 받으십시오.

    openssl s_client -connect jira.example.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt
    

    그런 다음 자신의 키 저장소로 가져옵니다.

    $JAVA_HOME/keytool -import -alias <server_name> -keystore $JAVA_HOME/lib/security/cacerts -file public.crt
    

    참고 : 위의 명령은 Unix 환경 용입니다. Windows에서 명령 줄에서 유사하게 openssl을 사용하는 것이 좋지만 같은 목적으로 사용할 수있는 GUI 도구도 있습니다.

  2. ==============================

    2.$ JAVA_HOME / lib / security / cacerts 파일이 있는지 확인하십시오! 제 경우에는 파일이 아니라 / etc / ssl / certs / java / cacerts에 대한 링크 였고 JVM이이 파일을 찾을 수 없기 때문에 이것이 자체 (WHAT ???)에 대한 링크였습니다.

    $ JAVA_HOME / lib / security / cacerts 파일이 있는지 확인하십시오! 제 경우에는 파일이 아니라 / etc / ssl / certs / java / cacerts에 대한 링크 였고 JVM이이 파일을 찾을 수 없기 때문에 이것이 자체 (WHAT ???)에 대한 링크였습니다.

    해결책: 실제 cacerts 파일을 다른 JDK에서 / etc / ssl / certs / java / 디렉토리로 복사하면 문제가 해결됩니다 :)

  3. ==============================

    3.@Gergely Bacso가 표시 한 인증서를 가져온 후에도 인증서 문제가 계속 발생하는 경우 IDE 또는 Java 응용 프로그램을 실행하는 데 사용되는 명령 줄에 링크 된 java.exe 또는 javaw.exe 바이너리가 JRE가 JRE가 아닌 사람은 인증서를 cacerts 키 저장소에 설치 한 후에도 인증서 오류가 발생했습니다. JDK의 바이너리를 사용할 때까지 인증서가 설치되지 않았습니다. JRE 로의 경로를 바꾼 후에 모든 것이 예상대로 진행되었고 성공적으로 연결할 수있었습니다. 문제를 디버그하려고하는 누군가의 시간을 절약 해주기를 바랍니다.

    @Gergely Bacso가 표시 한 인증서를 가져온 후에도 인증서 문제가 계속 발생하는 경우 IDE 또는 Java 응용 프로그램을 실행하는 데 사용되는 명령 줄에 링크 된 java.exe 또는 javaw.exe 바이너리가 JRE가 JRE가 아닌 사람은 인증서를 cacerts 키 저장소에 설치 한 후에도 인증서 오류가 발생했습니다. JDK의 바이너리를 사용할 때까지 인증서가 설치되지 않았습니다. JRE 로의 경로를 바꾼 후에 모든 것이 예상대로 진행되었고 성공적으로 연결할 수있었습니다. 문제를 디버그하려고하는 누군가의 시간을 절약 해주기를 바랍니다.

  4. ==============================

    4.대체 할 수 있습니다.

    대체 할 수 있습니다.

    String base64Creds = "Basic " + new String( encodedAuth );
    

    String base64Creds = new String( encodedAuth ); //"Basic " String duplicated
    
  5. from https://stackoverflow.com/questions/32051596/exception-unable-to-validate-certificate-of-the-target-in-spring-mvc by cc-by-sa and MIT license