2017-12-29 61 views
0

저는 약간의 초보자이므로 약간의 빠른 설명보다는 자세한 설명을 원합니다.자체 서명 된 인증서 (중간 CA 포함)를 사용하여 스프링 부트 응용 프로그램 배포

HTTPS를 통해 스프링 부트 응용 프로그램을 배포하려고합니다 (재미 나 테스트를 위해 프로덕션 환경으로 만들지 않습니다). 먼저 인증 기관 (루트 및 중개자)을 만든 다음 내 응용 프로그램 (localhost를 통해 액세스 할 수있는 인증서)을 만들고 중간 CA를 사용하여이 인증서에 서명했습니다. 이 작업을 수행하려면 this 튜토리얼을 사용했습니다.

그런 다음 this 답변을 사용하여 새로 만든 localhost 인증서를 키 저장소에 가져온 다음 응용 프로그램별로 배포했습니다. Chrome을 통해 액세스 할 때 두 가지 문제가있었습니다.

  1. 과목 대체 이름이 없습니다. 이 사이트의 인증서에 도메인 이름 또는 IP 주소가 포함 된 주체 대체 이름 확장명이 없습니다.

  2. 인증서 오류. 사이트의 인증서 체인에 문제가 있습니다 (net :: ERR_CERT_AUTHORITY_INVALID).

지금 내 문제에 대한 이해가 정확하다면 다음을 수행해야합니다.

  1. SAN은 도메인 이름과 일치하는 일반 이름을 성공시킨 일종의 인증서 확장명입니다. 이 확장을 localhost 인증서에 삽입해야합니다. 내 문제는 내가 어디에서해야하는지 모르겠다. 인증서 작성시입니까?

  2. 왜 이런 일이 발생하는지 잘 모르겠습니다. 한쪽 끝에서 내 CA가 내가 만든 것이고 설립 된 CA가 아니기 때문에 항상 이런 일이 일어날 것이라고 나는 느낍니다.하지만 온라인에서 볼 수있는 것으로부터 해결할 수는 있지만 어떻게 이해할 수는 없습니다. 방금 키 저장소에 로컬 호스트 인증서를 삽입했습니다. 중간 인증서도 주입해야합니까?

또한 위의 튜토리얼에 대한 질문이 있습니다. server_cert와 usr_cert의 차이점은 Sign server 및 Client certificates 섹션에 있습니다. 인증서는 서버의 인증서이지만 사용자 인증을 처리합니다. 이 경우 server_cert를 올바르게 사용해야합니까?

+0

내 server_cert 확장 프로그램 (이 리소스 덕분에, https://alexanderzeitler.com/articles/Fixing-Chrome-missing_subjectAltName-selfsigned-cert-openssl/)에 확장 기능을 추가하여 주체 대체 이름 문제를 해결할 수있었습니다. –

답변

0

내가 알아 낸 것 때문에 내 질문에 답합니다.

먼저 루트 CA와 중간 CA를 만들어야합니다. 언급 한대로 나는 this 튜토리얼을 따라 갔다. 그것은 매우 좋지만 강조 할 몇 가지 점이 있습니다.

  1. 당신이 당신의 root/ca 폴더의 위치로 디렉토리를 설정해야합니다 openssl.cnf 루트를 만드는. 이것은 지침에 명시되어 있지만 강조 표시하는 것이 좋습니다. 또한 기본값 (81-86 행)을 변경하여 루트 CA를 수행 할 때 준비되어 있는지 확인하십시오.당신의 중간 openssl.cnfroot/ca/intermediate로 디렉터리를 변경하고 디폴트 기본값을 변경 (라인 81 ~ 86) 루트 openssl.cnf와 일치하기를 만들 때

  2. 루트 인증서를 생성

    좋은 일반 이름을
  3. 를 선택했다.

  4. 또한 openssl.cnf의 일부로 this 링크 당 subjectAltName을 추가해야합니다. usr_certserver_cert 아래에 subjectAltName = @alt_names을 추가하십시오. 그러면 인증서를 만들 때 필요한 주체 대체 이름이 추가됩니다. 나는 당신이 단지 server_cert을 위해 이것을 정말로 필요로한다고 믿는다. 그러나 나는 안전을 위해서 (단지 어쨌든 user_cert을 사용하지 않았다. DNS.1은 localhost로 올바르게 설정됩니다.

  5. 중간 인증서를 만들 때 세부 정보는 루트 인증서에 대한 것과 동일해야합니다. 따라서 3 단계에서 조직 세부 정보를 복사해야하는 이유는 무엇입니까? 공통 이름은 달라야합니다.

  6. 조직의 세부 정보는 매우 익숙하지만 공통 이름은 localhost으로 설정해야합니다.

  7. 당신이 버전 (데이터에 따라) 3로 설정되어 있는지 서명 된 서버 인증서 확인을 확인

    은 주제 CN은 localhost로 설정하고, X509v3 Subject Alternative NameDNS:localhost로 설정됩니다.

완료되면 Sring Boot 응용 프로그램에 제공 할 트러스트 스토어를 만들어야합니다. 나는 this 개의 자원을 사용했다. 나는 PKCS12가 새로운 표준과 봄 때문에 JKS로 변환 귀찮게하지 않았다

openssl pkcs12 -export -inkey ./intermediate/private/localhost.key.pem -in cert-chain.txt -out cert-chain.p12 

다음 명령을 사용하여

cat ./intermediate/certs/localhost.cert.pem ./intermediate/certs/intermediate.cert.pem ./certs/ca.cert.pem > cert-chain.txt 

가 그럼 난 내 상점을 작성한 다음 명령을 사용하여 내 인증서 체인을 생성 부팅은이 형식으로 잘 작동합니다.

이 시점에서 나는 KeyStore Explorer을 사용하여 키 저장소에 올바른 계층 구조가 있는지 확인했습니다. 그것은 하나의 인증서 (localhost)를 가지고 있었고 인증서 계층을 보았을 때 root -> intermediate -> localhost를 보았습니다.

다음 것은 내가 src/main/resources 아래의 키 스토어를 넣어 않았고 당신이 수도 봄 보안을 사용하는 경우 내 YAML 속성에서 다음 속성 파일 (일반 .properties 파일도 작동합니다)

server.port: 8443 
server.ssl: 
    key-store: src/main/resources/cert-chain.p12 
    key-store-password: secretpassword 
    keyStoreType: PKCS12 

추가 또한 security.require-ssl: true을 사용해야합니다.

이 시점에서 ERR_CERT_AUTHORITY_INVALID이 표시되지만 어쨌든 진행할 수 있습니다. 이는 브라우저에서 루트/중개 CA를 신뢰할 수 없기 때문입니다. 브라우저를 통해 인증서를 보는 경우 루트 -> 중간 -> 로컬 호스트 계층을 다시 한 번 확인해야합니다. 중간 인증서를 브라우저로 가져온 다음 브라우저를 다시 시작하십시오. 녹색 보안 자물쇠가 보입니다. 성공! 당신은 이제 안전합니다!

참고 : 가끔 Active content with certificate errors 오류가 발생했습니다.이 경우 here과 같이 사이트 저장소를 삭제하십시오.