TLS 1.2 를 지원 하 는 웹 서버 Linux 버 전 0 부터 구축 (3) 무료 HTTPS 인증서 만 들 기
11444 단어 Linux 서버 설정
성명
본 논문 의 대부분 작업 은 Jerry Qu 의 Let 's Encrypt, 무료 로 사용 하기 좋 은 HTTPS 인증 서 를 참고 합 니 다. 그러나 원문 에 설 치 된 HTTP 서 비 스 는 Nginx 입 니 다. 본 고 는 Tomcat 9 입 니 다. 만약 에 사용 하 는 것 도 Nginx 라면 Let' s Encrypt, 무료 로 사용 하기 좋 은 HTTPS 인증 서 를 이동 하 십시오. 만약 에 여러분 이 사용 할 때 어떤 문 제 를 발견 하면 댓 글 에서 함께 토론 하 는 것 도 환영 합 니 다.
Let 's Encrypt, 무료 HTTPS 인증서
무료, 자동화, 개방 적 인 인증서 발급 서비스.이 는 ISRG (Internet Security Research Group, 인터넷 안전 연구 팀) 가 서 비 스 를 제공 하고 ISRG 는 미국 캘 리 포 니 아주 에서 온 공익 조직 이다.Let 's Encrypt 는 Mozilla, Cisco, Akamai, Electronic Frontier Foundation 과 Chrome 등 여러 회사 와 기구의 지원 을 받 아 매우 빠르게 발전 했다.
Let 's Encrypt 인증 서 를 신청 하 는 것 은 무료 일 뿐만 아니 라 매우 간단 합 니 다. 매번 90 일의 유효기간 만 있 지만 스 크 립 트 를 통 해 정기 적 으로 업데이트 할 수 있 습 니 다.
신청 도구
Jerry Qu 는 공식 적 인 도 구 를 사용 하지 않 고 acme - tiny 라 는 더욱 작은 오픈 소스 도 구 를 사 용 했 습 니 다. 저 는 HTTPS 신청 에 익숙 하지 않 습 니 다. 이번 이 첫 번 째 신청 입 니 다. 먼저 Jerry Qu 방식 으로 한 번 하고 자신 이 겪 은 문 제 를 기록 하기 로 했 습 니 다.
ACME 는 모두 Automated Certificate Management Environment 라 고 하 는데 직역 하면 자동화 인증서 관리 환경 이라는 뜻 이다. Let 's Encrypt 의 인증서 발급 과정 은 바로 ACME 프로 토 콜 을 사용한다.ACME 프로 토 콜 에 대한 더 많은 자 료 는 이 창고 에서 찾 을 수 있 습 니 다.
계 정 만 들 기
우선 디 렉 터 리 를 만 듭 니 다. 예 를 들 어
/usr/ssl
각종 임시 파일 과 마지막 인증서 파일 을 저장 합 니 다.이 디 렉 터 리 에 들 어가 서 Let 's Encrypt 에서 신분 을 식별 할 수 있 는 RSA 비밀 키 를 만 듭 니 다.[root@VM_195_229_centos usr]# mkdir ssl
[root@VM_195_229_centos usr]# cd ssl
[root@VM_195_229_centos ssl]# openssl genrsa 4096 > account.key
Generating RSA private key, 4096 bit long modulus
................................................................++
..........................................................................++
e is 65537 (0x10001)
[root@VM_195_229_centos ssl]# ls -l
total 4
-rw-r--r-- 1 root root 3243 Jul 31 20:08 account.key
CSR 파일 생 성
이 어 CSR (Certificate Signing Request, 인증서 서명 요청) 파일 을 만 들 수 있 습 니 다.그 전에 도 메 인 네 임 비밀 키 (위의 계 정 비밀 키 를 사용 하지 마 십시오) 를 만들어 야 합 니 다. 인증서 의 유형 에 따라 도 메 인 네 임 비밀 키 도 RSA 와 ECC 두 가지 유형 을 선택 할 수 있 습 니 다.다음 두 가지 방식 은 실제 상황 에 따라 둘 중 하 나 를 선택 하 십시오.
openssl genrsa 4096 > domain.key
#secp256r1
openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key
#secp384r1
openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key
ECC 인증서 에 대한 더 많은 소 개 는 여 기 를 클릭 하 십시오.
비밀 키 파일 이 있 으 면 CSR 파일 을 생 성 할 수 있 습 니 다.CSR 에 서 는 도 메 인 네 임 테이프
www
와 없 는 www
두 가지 상황 을 모두 추가 하 는 것 을 추천 합 니 다. 다른 도 메 인 은 필요 에 따라 추가 할 수 있 습 니 다 (현재 인증서 한 장 에 최대 100 개의 도 메 인 네 임 을 포함 할 수 있 습 니 다).openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config printf "[SAN]
subjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
이 단 계 를 실행 할 때
/etc/ssl/openssl.cnf
파일 을 찾 을 수 없다 면 /usr/local/openssl/ssl/openssl.cnf
존재 하 는 지 확인 하 십시오.만약 안 된다 면 대화 식 으로 CSR 을 만 들 수도 있 습 니 다. (Common Name 은 도 메 인 이름 이 어야 합 니 다.)openssl req -new -sha256 -key domain.key -out domain.csr
여기 서 제
openssl.cnf
디 렉 터 리 는 /etc/pki/tls/openssl.cnf
입 니 다. 먼저 이 파일 을 잠시 사용 하고 상호작용 으로 생 성 하지 않 았 습 니 다. CSR 파일 을 생 성 하 는 데 문제 가 없 었 습 니 다. 이어서 내 려 갑 니 다.인증 서비스 설정
CA 가 DV (Domain Validation) 인증 서 를 발급 할 때 도 메 인 이름 소유권 을 검증 해 야 한 다 는 것 을 알 고 있 습 니 다.전통 적 인 CA 의 인증 방식 은 보통
[email protected]
에 인증 메 일 을 보 냅 니 다. Let 's Encrypt 는 서버 에 무 작위 인증 파일 을 만 들 고 CSR 을 만 들 때 지정 한 도 메 인 에 접근 합 니 다. 방문 할 수 있다 면 이 도 메 인 에 대한 통제 권 이 있 음 을 나타 냅 니 다.Nginx 의 설정 방안 은 Let 's Encrypt, 무료 로 사용 할 수 있 는 HTTPS 인증 서 를 참고 하 십시오.
인증 파일 을 저장 할 디 렉 터 리 를 새로 만 듭 니 다.
/usr/ssl/challenges
디 렉 터 리:[root@VM_195_229_centos ssl]# mkdir /usr/ssl/challenges
Tomcat
의 설치 디 렉 터 리 를 찾 습 니 다. conf/server.xml
다음 에 설명 되 어 있 는 설정 정 보 를 찾 습 니 다.-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the
AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
--
port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
"conf/localhost-rsa.jks"
type="RSA" />
-->
-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the APR/native implementation which always uses
OpenSSL for TLS.
Either JSSE or OpenSSL style configuration may be used. OpenSSL style
configuration is used below.
-->
--
port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
"org.apache.coyote.http2.Http2Protocol" />
"conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
-->
사이트 인증서 가 져 오기
먼저 acme - tiny 스 크 립 트 를 이전
/usr/ssl
디 렉 터 리 에 저장 합 니 다.[root@VM_195_229_centos ssl]# wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
계 정 비밀 키, CSR 및 인증 디 렉 터 리 를 지정 하고 스 크 립 트 를 실행 합 니 다.
[root@VM_195_229_centos ssl]# python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt
모든 것 이 정상 이면 현재 디 렉 터 리 에 하나의
signed.crt
가 생 성 됩 니 다. 이것 이 바로 신청 한 인증서 파일 입 니 다.도 메 인 네 임 DNS 를 국내 에 해석 하면 이런 오류 가 발생 할 수 있 습 니 다.
ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg
도 메 인 이름 이 외국 에서 해석 되 지 않 을 가능성 이 높 기 때문에 외국 VPS 를 찾 아 검증 할 수 있 습 니 다.제 도 메 인 이름 은 최근 에 DNSPod 에서 알 리 클 라 우 드 로 바 뀌 었 고 마지막 에 CloudXNS 로 바 뀌 었 습 니 다. 바로 최근 에 두 집 이 외국 에서 모두 불안정 하기 때 문 입 니 다.만약 당신 도 비슷 한 상황 에 부 딪 혔 다 면, 잠시 외국 의 DNS 분석 서비스 업 체, 예 를 들 어 dns. he. net 을 사용 할 수 있 습 니 다.만약 아직도 정 해 지지 않 는 다 면, '닐 팡 / le' 이라는 도구 의 DNS 모드 를 시험 해 볼 수도 있다.
사이트 인증 서 를 완성 한 후 Let 's Encrypt 의 중간 인증 서 를 다운로드 해 야 합 니 다.이전 글 에서 HTTPS 인증 서 를 설정 할 때 중간 인증 서 를 빠 뜨리 지 말고 루트 인증 서 를 포함 하 는 것 도 잊 지 말 라 고 했 습 니 다.Nginx 설정 에서 중간 인증서 와 사이트 인증 서 를 합 쳐 야 합 니 다.
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
OCSP Stapling 을 원활 하 게 사용 할 수 있 도록 루트 인증서 와 중간 인증 서 를 합 칩 니 다.
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
최종 적 으로 Nginx 의 인증서 설정 과 reload 서 비 스 를 수정 하면 됩 니 다.
자동 업데이트 설정
Let 's Encrypt 에서 발급 한 인증 서 는 90 일 유효기간 이 므 로 스 크 립 트 를 사용 하여 정기 적 으로 업데이트 하 는 것 을 추천 합 니 다.예 를 들 어 저 는
renew_cert.sh
을 만 들 고 chmod a+x renew_cert.sh
를 통 해 집행 권한 을 부 여 했 습 니 다.파일 내용 은 다음 과 같 습 니 다.#!/bin/bash
cd /home/xxx/www/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/xxx/www/challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
service nginx reload
crontab 에서 절대 경 로 를 사용 하 는 것 이 비교적 안전 합 니 다.
crontab -e
다음 과 같은 내용 을 가입 합 니 다.0 0 1 * * /home/xxx/shell/renew_cert.sh >/dev/null 2>&1
이렇게 되면 증 서 는 매달 자동 으로 업데이트 되 고 한 번 고생 하면 영원히 편안 해진 다.실제로 Let 's Encrypt 는 공식 적 으로 인증서 의 유효기간 을 90 일 로 정 하 는 것 은 더욱 안전 하고 더욱 중요 한 것 은 사용자 가 자동화 배치 방안 을 사용 하도록 격려 하 는 것 이다.
참고 문헌