Let's Encrypt는 사용자에게 무료로 SSL인증서를 발급해주는 비영리기관이다. 모질라재단, 페이스북, 구글 크롬 등 많은 업체가 스폰서로 등록되어 있습니다. 발급된 인증서는 3개월간 사용할 수 있으며, 만료전 갱신하면 계속해서 사용이 가합니다.
이번에는 이 Let's Encrypt 인증서를 구글 앱앤진에서 사용하는 방법을 알아 보갰습니다.
작업은 우분투 리눅스에서 하였고요. 리눅스라면 다른 OS도 무방하다 생각됩니다.
git clone https://github.com/letsencrypt/letsencrypt
소스는 github에 올라와 있으니 적당한 위치에 받아서 인스톨 해줍니다.
그리고 다음의 명령으로 실행하면 수동으로 인증절차를 받을수 있는대요. 다른곳에서는 자동으로 인증 절차를 받는 방법을 설명하다보니 앱앤진에서 잘 되지 않았습니다.
sudo ./letsencrypt-auto -a manual certonly
첫번째 질문이 나옵니다. Yes로 넘겨 주었고요.
두번째 질문에 사용하시는 앱앤진의 도메인을 너으시면 아래와 같이 코드를 하나 주고 대기 상태에 빠집니다. 여기서 넘어 가지 마시고 저 코드로 프로그램에서 주는 호출을 받아서 보내줘야 합니다.
그래서 보토은 리눅스의 80포트를 열고 주소뒤의 코드인
z7PBWdo48GqGxDW_dnr7veY-PEvDMhW1hLWTxIXvGGs.SA45YKNbvTbfjB7xAGrWY9Aw-h7ezpFLrBstEoxT1W4
이것만 넘겨주는 경우들이 많은대요. 구글 앱앤진이 떠있는 상태에서 80포트를 하나 더 열수가 없어서 프로그램을 만들어서 리턴해주었습니다.
http://도메인/.well-known/acme-challenge/z7PBWdo48GqGxDW_dnr7veY-PEvDMhW1hLWTxIXvGGs
의 호출을 받았을경우 z7PBWdo48GqGxDW_dnr7veY-PEvDMhW1hLWTxIXvGGs.SA45YKNbvTbfjB7xAGrWY9Aw-h7ezpFLrBstEoxT1W4 코드만 넘겨 줄수 있으면 형식은 상관 없는듯 합니다.
class LetsEncryptHandler(RequestHandler):
def get(self, challenge): self.response.headers['Content-Type'] = 'text/plain' responses = { '[challenge 1]': '[response 1]', '[challenge 2]': '[response 2]' } self.response.write(responses.get(challenge, '')) application = WSGIApplication([ ('/.well-known/acme-challenge/([\w-]+)', LetsEncryptHandler), ])
참조한 사이트의 코드입니다. 하지만 코드가 잘 리턴되지 않아서 self.response.write(responses.get(challenge, '')) 이부분에서 그냥 코드를 하드코딩 하여 넘겨주었습니다.
class LetsEncryptHandler(webapp2.RequestHandler):
def get(self, challenge):
self.response.headers['Content-Type'] = 'text/plain'
responses = {
'[challenge 1]': '[response 1]',
'[challenge 2]': '[response 2]'
}
url = self.request.url
self.response.write('Mdb8eiElyIVOKTTzBvVk-niySoEl2vwtdKsv1DUp3Sg.SA45YKNbvTbfjB7xAGrWY9Aw-h7ezpFLrBstEoxT1W4')
app = webapp2.WSGIApplication([
('/', MainHandler), ('/.well-known/acme-challenge/([\w-]+)', LetsEncryptHandler)
], debug=True)
테스트 하던 당시의 코드라서 리턴값이 위에 쓴것과 다릅니다.
그리고 조심해야 할부분이 코드를 잘못넘겨줘서 5번 이상 실패하면 인증 절차가 1시간정도 잠겨 버립니다.
/etc/letsencrypt/live/<path_to_site>
생성된 인증서는 위의 경로에 생성되고요 접근하려면 ROOT 권한이 필요 합니다.
opennssl rsa -in privkey.pem -out rsa.pem
명령어로 비공개 키를 하나 생성합니다.
위의 사진과 같이 생성한 인증키를 모두 입력 해주시면 앱앤진의 SSL인증서 세팅이 완료 됩니다.
참조한 사이트
https://medium.com/google-cloud/let-s-encrypt-with-app-engine-8047b0642895
https://gist.github.com/tildebyte/c85f65c1e474a6c4a6188755e710979b
http://blog.seafuj.com/lets-encrypt-on-google-app-engine