LetsEncryptκ° IPμ λν μΈμ¦μλ₯Ό λ°κΈνμ§ μλλ€λ μ μ κ³ λ €νλ©΄, letsEncryptμ μμ²μ 보λ΄κΈ° μ μ ν΄λΉ λ Όλ¦¬λ₯Ό allow_domain ꡬμ±/κΈ°λ₯μ μΆκ°νλ κ²λ³΄λ€ IP μ£Όμλ₯Ό κ°μ§νκ³ λ¬΄μνλ κ²μ΄ μ’μ΅λλ€.
λλ κ·Έκ²μ λν μνλ₯Ό μΌκ³ , μ΄λ―Έ κ½€ μΌμ° μ€ν¨νλ€λ κ²μ μμλμ΅λλ€.
ssl_certificate(): auto-ssl: μμ²μ λν λλ©μΈμ κ²°μ ν μ μμ΅λλ€(SNIκ° μ§μλμ§ μμ΅λκΉ?) - λ체 μ¬μ© -
λΈλΌμ°μ κ° IP μ£Όμλ₯Ό μμ²ν λ SNI ν€λλ₯Ό 보λ΄μ§ μμΌλ―λ‘ "λλ©μΈ"λ μ€μ λμ§ μμ΅λλ€.
λ΄ μμ²μ΄ μνΈνλ₯Ό νμ©νλΌλ μμ²μ λ³΄λΈ μ΄μ κ° νμ€νμ§ μμ΅λλ€. κ·Έλ° λ€μ SSL μΈμ¦μλ₯Ό IPλ‘ λ±λ‘νλ κ²μ λν μ€λ₯λ₯Ό 보λ΄λ μ€μ΄μμ΅λλ€.
@discobean : μ΄κ²μ 보μμ λ λ°μνλ νΉμ μ€λ₯ λ©μμ§κ° μμ΅λκΉ?
@GUI λλλ‘ κ°μ μ€λ₯κ° λ°μν©λλ€. λ΄ μκ°μ μ΄κ²μ ν΄λΌμ΄μΈνΈ(μ€μΊλ λ΄μΌ μ μμ)κ° λμ IP μ£Όμμ λμΌν νΈμ€νΈ ν€λλ₯Ό 보λ΄κΈ° λλ¬Έμ λλ€. μ:
2018/02/20 02:10:44 [warn] 490#490: *2723 [lua] init_by_lua:11: allow_domain(): auto-ssl: debug allow_domain domain XXX.XXX.XX.XX, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] lets_encrypt.lua:41: issue_cert(): auto-ssl: dehydrated failed: env HOOK_SECRET=XXXXX HOOK_SERVER_PORT=8999 /usr/local/bin/resty-auto-ssl/dehydrated --cron --accept-terms --no-lock --domain XXX.XXX.XX.XX --challenge http-01 --config /etc/resty-auto-ssl/letsencrypt/config --hook /usr/local/bin/resty-auto-ssl/letsencrypt_hooks status: 256 out: # INFO: Using main config file /etc/resty-auto-ssl/letsencrypt/config
Processing XXX.XXX.XX.XX
+ Signing domains...
+ Creating new directory /etc/resty-auto-ssl/letsencrypt/certs/XXX.XXX.XX.XX ...
+ Generating private key...
+ Generating signing request...
+ Requesting authorization for XXX.XXX.XX.XX...
err: + ERROR: An error occurred while sending post-request to https://acme-v01.api.letsencrypt.org/acme/new-authz (Status 400)
Details:
{
"type": "urn:acme:error:malformed",
"detail": "Error creating new authz :: Issuance for IP addresses not supported",
"status": 400
}
, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:97: issue_cert(): auto-ssl: issuing new certificate failed: dehydrated failure, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:286: auto-ssl: could not get certificate for XXX.XXX.XX.XX - using fallback - failed to get or issue certificate, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
μ¬κΈ°μ XXX.XXX.XX.XX
λ μ€μ μλ² IP μ£Όμμ
λλ€.
μ λ μ½λμμ μ΄κ²μ μ°¨λ¨νλ λ° μ°¬μ±ν©λλ€. νμ§λ§, eh: "not for these"(λΈλ리μ€νΈ μ κ·Ό λ°©μ)κ° μλ (νμ΄νΈλ¦¬μ€νΈ μ κ·Ό λ°©μ)μ λν΄ μΈμ¦μκ° μμ±λκΈ°λ₯Ό μνλ FQDNμ allow_domain() _only_ νμ©ν΄μΌ ν©λλ€.
allow_domain()μμ λ¨μν "trueλ₯Ό λ°ν"ν΄μλ μλ©λλ€. μμ€ν μ λΆλ΄μ μ£Όκ³ LEμ λν μ€ν¨λ₯Ό λμ ν©λλ€.
νμ§λ§ μ°λ¦¬λ ν λ¨κ³ λ λμκ°κ³ μμ΅λλ€. μ°λ¦¬λ λͺ¨λ μΉνΈμ€ν κ³ κ° λͺ©λ‘μ λμ€ν¬μ Lua ν μ΄λΈ νμΌλ‘ λ΄λ³΄λ΄κ³ μ΄λ₯Ό μ½κ³ nginx λ΄λΆμ SHM ν€/κ° μ μ₯μμ μ μ₯νλ―λ‘ μΈμ¦μλ₯Ό μμ±ν΄μΌ νλμ§ μ¬λΆλ₯Ό μ½κ² νμΈν μ μμ΅λλ€.
κ΄λ¦¬ νΈμ€νΈ μ΄λ¦μ λν΄ μ¬λ¬ κ°μ μμΌλμΉ΄λ μΈμ¦μκ° μμΌλ―λ‘ ν΄λΉ SSL μΈμ¦μκ° ν¬ν¨λ κ΅μ²΄λ SSL 체μΈμΌλ‘ μΌμ° μ’ λ£ν©λλ€. μ°λ¦¬λ IP μ£Όμμ localhostμμ μΌμ° μ’ λ£ν©λλ€. κ·Έλ° λ€μ λ§μ§λ§μΌλ‘ DNSλ₯Ό νμΈνκ³ μ΄λ¦μ΄ μ€μ λ‘ μμ€ν μ ꡬμ±λ λλ©μΈ λͺ©λ‘μ μλμ§ μ¬λΆλ₯Ό νμΈν©λλ€.
μ΄λ¬ν κ²μ¬μ λλΆλΆμ μκ°μ΄ μ§λλ©΄ μ±κ³΅ν μ μμ§λ§ μ€μ λ‘ νμν κ²μ μλλλ€. μμ : λΈλ리μ€νΈ λμ νμ΄νΈλ¦¬μ€νΈλ₯Ό μ¬μ©νμμμ€. μΌλ°μ μΈ μ½λ μ°μ΅μ΄κΈ°λ ν©λλ€. μ£μ‘ν©λλ€λ³΄λ€ λ μμ .
κ·Έλ¦¬κ³ λλ‘λ λ λ€λ₯Έ μ€ν¨ μ§μ μ΄ λ μ μλ λ€μν κ²μ¬λ₯Ό κ³Όλνκ² μμ§λμ΄λ§νκ³ κ±΄λλ°μ§ μλ κ²μ΄ μ’μ΅λλ€. νΉν λ§€μ° λμ μΈ νκ²½μ΄ μλ κ²½μ°.
λλ μ΄κ²μ΄ lua-resty-auto-sslμμ μ°¨λ¨λμ΄μΌ νλ€κ³ λ§νλ κ²μ΄ μλλΌ λ€λ₯Έ μ¬λμ΄ μ΄ λ¬Έμ λ₯Ό μ°μ°ν λ°κ²¬νλμ§ ν μ€νΈνλ λμ λ°κ²¬ν κ²μ 곡μ νλ κ²μ λλ€.
allow_domain
μ λΉ λ₯Έ ν΄νΉ:
local ip_chunks = {domain:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}
if (#ip_chunks == 4) then
return false
end
νμ΄νΈλ¦¬μ€ν μ κ³Όλν μμ§λμ΄λ§μ΄ μλλΌ μ¬λ°λ₯΄κ² μννλ κ²μ λλ€. κ°λ°μλ€μ΄ νμ΄νΈλ¦¬μ€ν λμ λΈλ리μ€ν μ μ¬μ©νκΈ° λλ¬Έμ μΈμμλ 보μ μ¬κ³ κ° λ무 λ§μ΅λλ€.
κ·νμ μνλ λν IPv6 μ£Όμλ₯Ό 건λλ°κ³ μ€μ λ‘ κ³Όλνκ² μ€κ³λμμ΅λλ€.
if string.match(domain, "(%d+).(%d+).(%d+).(%d+)") or string.find(domain, ":", 1, true) then
return false
end
λΉμ μ μ°λ¦¬μ μν©μ λͺ¨λ₯΄μ§λ§ λΉ λ₯΄κ² νλ¨ν©λλ€. μμ μ μμμ΄.
λͺ¨λ μ¬λμ λ μμ νκ² λ§λ€κΈ° μν΄ true
λ₯Ό λ°ννλ κ²λ³΄λ€ PRμ λ§λ€κ³ README.mdμ allow_domain
λ₯Ό λ ν©λ¦¬μ μΈ κ²μΌλ‘ λ³κ²½ν μ μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
νμ΄νΈλ¦¬μ€ν μ κ³Όλν μμ§λμ΄λ§μ΄ μλλΌ μ¬λ°λ₯΄κ² μννλ κ²μ λλ€. κ°λ°μλ€μ΄ νμ΄νΈλ¦¬μ€ν λμ λΈλ리μ€ν μ μ¬μ©νκΈ° λλ¬Έμ μΈμμλ 보μ μ¬κ³ κ° λ무 λ§μ΅λλ€.
κ·νμ μνλ λν IPv6 μ£Όμλ₯Ό 건λλ°κ³ μ€μ λ‘ κ³Όλνκ² μ€κ³λμμ΅λλ€.