개발자 되어버리기

Springboot + Flutter Web + Apache2 + Let's Encrypt로 https 구성하기 본문

개발

Springboot + Flutter Web + Apache2 + Let's Encrypt로 https 구성하기

구백군 2024. 9. 11. 00:56

이전에는 let's encrypt가 플러터 통신할때 뭔가 안맞아서 zero ssl로 cname 찾아서 인증받고 그랬었는데.. 

이제는 문제가 해결된듯 하여 다시 Let's Encrypt를 사용하기로 마음먹었다.

 

기존에는 Springboot 자체적으로 https를 적용해왔었는데

이게 서비스가 많아지다 보니 그냥 웹서버 하나 두고 얘가 reverse proxy로 퍼다 나르는게 낫겠다 싶었다.

 

 

일단 기존 스프링부트에서 쓰던 인증서는 주석 처리 해준다.

#server:
#  ssl:
#    enabled: true
#    key-store: ./cert_and_key.p12
#    key-store-password: helloworld
#    key-store-type: PKCS12
#    key-alias: tomcat

 

 

우분투부터 업데이트 해준다.

sudo apt-get update

 

 

아파치도 야무지게 설치해주고 시작해준다.

sudo apt install apache2
sudo systemctl start apache2
sudo systemctl enable apache2

 

 

그리고 Certbot 설치 해준다.

 

sudo apt install certbot python3-certbot-apache

 

 

나는 pwmw.xyz 라는 도메인을 사용하므로 같이 넣어준다.(www 도 쓰면 추가해주자. 나는 참고로 안 씀)

sudo certbot --apache -d pwmw.xyz -d www.pwmw.xyz

 

아마 이메일 입력하라고 나왔던 것 같은데 적당히 입력해주자.

 

추후 Certbot이 기본적으로 갱신 스케줄러를 설정하기에 재갱신 걱정은 없다고 한다.

인증서 발급까지 잘 되었으면 이후에도 발급이 잘 될지 봐야하니 테스트를 해준다.

 

sudo certbot renew --dry-run

 

 

그러면 아래와 같이 무언가 물어본다.

1: Attempt to reinstall this existing certificate
2: Renew & replace the certificate (may be subject to CA rate limits)

 

  • 1번: 인증서가 손상되었거나 문제가 있어서 다시 설치해야 한다면 선택.
  • 2번: 인증서를 새로 갱신하고 교체하려면 선택.

 

 

하게 되면 기존 인증서를 재설치할건지( 1 번 ) 새로운 인증서를 다시 발급받을건지( 2 번 ) 물어보는데 Lets Encrypt에서는 매주 50번의 갱신 요청을 하기 때문에 걱정없이 2번으로 하면 된다.

 

아마 여기까지는 다들 기본적으로 하는 세팅이다.

 

문제는 지금부터다.

 

나는 8080, 9010, 9011, 9020, 9021을 https로 쓸 예정이다. 이는 아파치에서 바인딩 시켜줘야하는 포트들이다.

실제 스프링부트는 19020, 19021 포트로 실행될 예정이다.

 

우선 관련 포트들을 우분투에서 받아줄 수 있도록 열어줘야 한다.

sudo ufw allow 8080
sudo ufw allow 9010
sudo ufw allow 9011
sudo ufw allow 9020
sudo ufw allow 9021

 

 

Flutter web에서 쓰일 포트는 9010과 9011이다.

Springboot로 들어갈 코드는 9020과 9021이다.

 

먼저 Flutter web에서 쓰일 설정값을 써보겠다.

sudo vim /etc/apache2/sites-available/default-ssl.conf

 

전체 파일 구조는 이러하다.

Springboot에서는 웹소켓도 사용하고 있기에 관련 설정이 추가 된다.

<IfModule mod_ssl.c>
	<VirtualHost _default_:8080>
    	ServerAdmin dev@pwmw.xyz
    	ServerName pwmw.xyz

    	DocumentRoot /var/www/html
    	ErrorLog ${APACHE_LOG_DIR}/error8080.log
    	CustomLog ${APACHE_LOG_DIR}/access8080.log combined
    	SSLEngine on
    	<FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
    	</FilesMatch>
    	<Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
    	</Directory>
    	Include /etc/letsencrypt/options-ssl-apache.conf
    	SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
    	SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
	</VirtualHost>
	<VirtualHost _default_:9010>
		ServerAdmin dev@pwmw.xyz
		ServerName pwmw.xyz

		DocumentRoot /var/www/html
		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined
		SSLEngine on
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
				SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
				SSLOptions +StdEnvVars
		</Directory>
		Include	/etc/letsencrypt/options-ssl-apache.conf
		SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
	</VirtualHost>
	<VirtualHost _default_:9011>
		ServerAdmin dev@pwmw.xyz
		ServerName pwmw.xyz

		DocumentRoot /var/www/html
		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined
		SSLEngine on
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
				SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
				SSLOptions +StdEnvVars
		</Directory>
		Include	/etc/letsencrypt/options-ssl-apache.conf
		SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
	</VirtualHost>
	<VirtualHost _default_:9020>
    	ServerAdmin dev@pwmw.xyz
    	ServerName pwmw.xyz
    
		DocumentRoot /var/www/html
		ProxyPreserveHost On
    	ProxyPass / http://localhost:19020/
    	ProxyPassReverse / http://localhost:19020/
    	# WebSocket 트래픽 프록시
    	RewriteEngine On
    	RewriteCond %{HTTP:Upgrade} websocket [NC]
    	RewriteCond %{HTTP:Connection} upgrade [NC]
	    RewriteRule /(.*) ws://localhost:19020/$1 [P,L]
	    DocumentRoot /var/www/html
	    ErrorLog ${APACHE_LOG_DIR}/error9020.log
	    CustomLog ${APACHE_LOG_DIR}/access9020.log combined
	    SSLEngine on
	    <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
    	</FilesMatch>
    	<Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
    	</Directory>
    	Include /etc/letsencrypt/options-ssl-apache.conf
    	SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
    	SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
	</VirtualHost>
	<VirtualHost _default_:9021>
	    ServerAdmin dev@pwmw.xyz
	    ServerName pwmw.xyz
	    ProxyPreserveHost On

    	ProxyPass / http://localhost:19021/
    	ProxyPassReverse / http://localhost:19021/
    	# WebSocket 트래픽 프록시
    	RewriteEngine On
    	RewriteCond %{HTTP:Upgrade} websocket [NC]
    	RewriteCond %{HTTP:Connection} upgrade [NC]
    	RewriteRule /(.*) ws://localhost:19021/$1 [P,L]
    	#DocumentRoot /var/www/html
    	ErrorLog ${APACHE_LOG_DIR}/error9021.log
    	CustomLog ${APACHE_LOG_DIR}/access9021.log combined
    	SSLEngine on
    	<FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
    	</FilesMatch>
    	<Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
    	</Directory>
    	Include /etc/letsencrypt/options-ssl-apache.conf
    	SSLCertificateFile /etc/letsencrypt/live/pwmw.xyz/fullchain.pem
    	SSLCertificateKeyFile /etc/letsencrypt/live/pwmw.xyz/privkey.pem
	</VirtualHost>

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

 

 

이제 남은건 아파치에서 해당 포트들을 리스닝하게 해주는 것 뿐이다.

우선 프록시부터 활성화 해준다.

sudo a2enmod proxy
sudo a2enmod proxy_http

 

포트 리스닝

sudo vim /etc/apache2/ports.conf

 

 

Listen 80
Listen 9010
Listen 9020
Listen 9021
Listen 8080
<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

 

 

이후 아파치를 재시작해주면 된다.

sudo systemctl restart apache2