[2021.08.09] How to set SSL on Nginx Using Centos7?
-> 위의 사진처럼 하는 것이 이번 finhub 프로젝트의 목표이다.
이제 Nginx에서 SSL 설치 및 포트 포워딩 하는 방법에 대해서 알아보자
+ 여러개의 도메인 서버에 SSL 추가하는 방법 포함
* 환경 : Centos7
https://injekim97.tistory.com/378
-> SSL 발급 받는 방법
https://injekim97.tistory.com/383
-> SSL 도메인 이름 바꾸는 방법
현재 도메인명 : *.gateway.finhub.co.kr
수정 될 도메인명 : *.finhub.co.kr
---------------------------------------------------------------------------------------------------------------------------------------------------------
ssls.com 파일에서 다운로드 zip 파일을 압축해보면, 총3개로 구성 되어 있다.
star.finhub.co.kr.ca-bundle star.finhub.co.kr.crt star.finhub.co.kr.p7b
* star.finhub.co.kr.crt
-> 도메인.crt 파일
* star.finhub.co.kr.ca-bundle
-> 중간 인증서와 루트 인증서가 포함되어 있다.
* star.finhub.co.kr.p7b
-> 상담을 통해 물어보니, Nginx에서는 p7b를 사용하지 않는다고 한다.
Nginx에 SSL를 설치하기 위한 과정들
Step 1: Combine Certificates Into One File (인증서 파일을 하나로 결합)
1-1) Method if you received and uploaded the intermediate and root Certificates separately
-> 중간 인증서와 루트 인증서를 별도로 받아서 업로드한 경우의 방법
cat your_domain.crt middle.crt root.crt >> ssl-bundle.crt
cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> ssl-bundle.crt
1- 2 ) Method if you received the intermediate Certificates in one bundle file, or downloaded the Certificate files from your SSLs.com Account
-> 중간 인증서를 하나의 번들 파일로 받았거나 SSLs.com 계정에서 인증서 파일을 다운로드한 경우 방법
나는 1-2에 해당한다. 이 방법으로 설명하겠다.
하기전에, 디렉토리를 만들어 파일을 옮긴 후
sudo chmod 777 디렉토리명
cat your_domain.crt your_domain.ca-bundle >> ssl-bundle.crt
[centos@ip-172-31-8-236 crt_directory]$ cat star.finhub.co.kr.crt star.finhub.co.kr.ca-bundle >> ssl-bundle.crt
[centos@ip-172-31-8-236 crt_directory]$ ls
ssl-bundle.crt star.finhub.co.kr.ca-bundle star.finhub.co.kr.crt star.finhub.co.kr.p7b
[centos@ip-172-31-8-236 crt_directory]$
이제 nginx conf 파일을 수정 하자
* ssl_certificate
/home/centos/crt_directory/ssl-bundle.crt
-> 아까 1-2에서 bundle 과 도메인.crt를 병합해서 생성한 파일 경로를 지정해주면 된다.
* ssl_certificate_key
/home/centos/example-rsa.key
-> CSR과 함께 생성된 key파일을 경로로 지정해줘야함.
openssl rsa -in example.key -out example-rsa.key
-> ★★★ nginx에서 SSL 키를 사용하려면, rsa키로 꼭 변환해줘야 한다. ★★★
이제 nginx를 restart 했는데 아래와 같은 에러메세지 발생
nginx[10496]: nginx: [emerg] PEM_read_bio_X509("/인증서파일경로/unified.myssl.pem") failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line)
원인 : 이 에러는 병합할 때, ----------가 계행이 되지 않은 경우이다.
해결 방법 : ---------- 를 계행 해주면 됨
예 ) 잘못된 경우
[centos@ip-172-31-8-236 crt_directory]$ cat ssl-bundle.crt
-----BEGIN CERTIFICATE-----
MIIGNTCCBR2gAwIBAgIQZXGnXtufixG1PRtv2owilTANBgkqhkiG9w0BAQsFADCB
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
-----END CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
~~~~-----END CERTIFICATE-----
예 ) 잘 수정한 경우
[centos@ip-172-31-8-236 crt_directory]$ cat ssl-bundle.crt
-----BEGIN CERTIFICATE-----
MIIGNTCCBR2gAwIBAgIQZXGnXtufixG1PRtv2owilTANBgkqhkiG9w0BAQsFADCB
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-----END CERTIFICATE-----
---------------------------------------------------------------------------------------------------------------------------------
이제 nginx에 SSL 설치 * 포트 포워딩을 해보자.
<Centos7 에서 SSL 설정 방법 - 21.08.10 성공>
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name smtrgateway.finhub.co.kr;
#root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location / {
proxy_pass http://127.0.0.1:8080;
}
rewrite ^ https://$server_name$request_uri? permanent;
}
# Settings for a TLS enabled server.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name smtrgateway.finhub.co.kr;
#root /usr/share/nginx/html;
ssl on;
ssl_certificate "/etc/pki/nginx/crt_directory/ssl-bundle.crt";
ssl_certificate_key "/etc/pki/nginx/example-rsa.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
}
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
---------------------------------------------------------------------------------------------------------------------------------
<SSL 설치 전 모습>
<SSL 설치 후 모습>
------------------------------------------------------------------------------------------------------------------------------
★ 포트 포워딩을 해주기 위해선 ★
server {
listen 80;
listen [::]:80;
server_name smtrgateway.finhub.co.kr;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
location / {
proxy_pass http://127.0.0.1:8080;
# 즉, server_name으로 접속하면, proxy_pass에 의해 8080 포트로 보내준다는 의미이다.
}
★★★★★ http(80) 포트로 접속하면, https(443) 포트로 보내주기 위해선? ★★★★★
rewrite ^ https://$server_name$request_uri? permanent;
★★★★★ 여러개의 도메인 서버에 SSL을 설정하려면?? ★★★★★
server {
listen 80;
listen [::]:80;
server_name center.finhub.co.kr merchant.finhub.co.kr gateway.finhub.co.kr
# Load configuration files for the default server block.
#include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location / {
proxy_pass http://127.0.0.1:8080;
}
rewrite ^ https://$server_name$request_uri? permanent;
}
server_name center.finhub.co.kr merchant.finhub.co.kr gateway.finhub.co.kr
-> 위의 코드에서 server_name만 바꿔주면 됨 (콤마 없이 뛰어쓰기로 추가해주면 된다.)
댓글