GoogleAppEngine (Java)에서 자체 도메인을 무료 인증서 (LetsEncrypt)로 사용하는 방법

8526 단어 letsencryptGAE
내용은 대부분Setup Let’s Encrypt SSL on Google Appengine입니다.

준비



자체 도메인 설정과 LetsEncrypt 설치는 생략합니다.
Google App Engine Java에서 어떤 배포를 할 수 있다고 가정합니다.

challenge code 및 response code 얻기



letsencrypt가 들어 있는 터미널에서 다음 명령을 실행합니다.
sudo letsencrypt-auto -a manual certonly

먼저 도메인을 지정합니다.


여기서 [YES]를 클릭하면


challenge code와 response code를 알 수 있습니다.


LetsEncrypt에서 인증서 받기



이것을 http://[사용자 정의 도메인]/.well-known/acme-challenge/[challenge code]
라고 건네주고, response code를 돌려주면 OK이므로
public class LetsencryptServlet extends HttpServlet {

    public static final Map<String, String> challenges = new HashMap<String, String>();

    static {
        // challenge codeをKeyにして、response codeを返値する。
        challenges.put("hflP1MkFxkoLQyrPKwblQ-BwJC67IKSA0AK2kPsOI8M",
                "hflP1MkFxkoLQyrPKwblQ-BwJC67IKSA0AK2kPsOI8M.TEc9CM-bX75lCoGQwUF5BnM2K5iowriH4SOCvwuwJpk");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        if (!req.getRequestURI().startsWith("/.well-known/acme-challenge/")) {
            resp.sendError(404);
            return;
        }
        String id = req.getRequestURI().substring("/.well-known/acme-challenge/".length());
        if (!challenges.containsKey(id)) {
            resp.sendError(404);
            return;
        }
        resp.setContentType("text/plain");
        resp.getOutputStream().print(challenges.get(id));
    }
}

web.xml
<servlet>
    <servlet-name>letsencrypt</servlet-name>
    <servlet-class>...LetsencryptServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>letsencrypt</servlet-name>
    <url-pattern>/.well-known/acme-challenge/*</url-pattern>
</servlet-mapping>

<!-- LetsEncrypt用にここはHTTP通信で行う。 -->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>HTTP</web-resource-name>
            <url-pattern>/.well-known/acme-challenge/*</url-pattern>
        </web-resource-collection>
</security-constraint>
<!-- SSL Redirect -->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>SSL Redirect</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

letsencrypt와 통신하는 부분은 http에서 deploy합니다.

deploy하여 반영시킨 후 터미널에서 [ENTER] 키를 누릅니다.

잘하면/etc/letsencrypt/live/[사용자 정의 도메인] 아래에 인증서가 완성됩니다.
cert.pem    chain.pem   fullchain.pem   privkey.pem

인증서 변환



openssl 명령을 사용하여 "해독된 PEM으로 인코딩된 RSA 개인 키"를 만듭니다.
openssl rsa -inform pem \
  -in live/[カスタムドメイン]/privkey.pem \
  -outform pem > live/[カスタムドメイン]/privkey_fixed.pem

PEM으로 인코딩 된 X.509 공개 키 인증서 (fullchain.pem)와 해독 된 PEM으로 인코딩 된 RSA 개인 키 (privkey_fixed.pem)를 AppEngine의 설정 → SSL 인증서 → 새 인증서 업로드에서 업로드합니다.



그런 다음 인증서를 활성화합니다.


체크를 넣은 후 저장 버튼을 누릅니다.


즉시 반영되지 않습니다.
10분 정도 걸리는 것 같아요. 인증서 반영 후 인증서가 활성화되어 있는지 확인합니다.

미래의 도전



ComputeEngine을 사용하여 cron으로 90일마다 git에서 master를 취득하고, challenge code와 response code를 취득해, deploy하고, 증명서를 업로드해… , 장벽이 너무 많아 꽤 어렵습니다.

좋은 웹페이지 즐겨찾기