目次

19 Let's Encrypt ワイルドカード証明書

今回はValueドメインでドメインを管理している場合の方法

1.certbotなどインストール

必要になるcertbotとphp-cli php-curlをインストール

snap install --classic certbot
apt install php-cli php-curl

2.Valueドメイン用スクリプト用意

[APIKEY]はValueドメインにログイン後、マイページ → バリュードメインAPI で作ったAPIKEYを利用。

もし他にも必要なレコードがあれば、$postfieldsのrecordsに改行で区切りながら書いておく

vapi.php

<?php
$apikey = '[APIKEY]';

$mode = $argv[1];
switch($mode){
  case "info": 
    $method = "GET";
    break;
  case "put":
    $method = "PUT";
    break;
  default:
    echo "argments error.";
    exit;
}
if($method == "PUT"){
    $CERTBOT_VALIDATION=$argv[3];
    $IP=$argv[4];
    $postfields = array(
      "ns_type" => "valuedomain1",
      "records" => "a @ ${IP}\na * ${IP}\ntxt _acme-challenge ${CERTBOT_VALIDATION}\n",
      "ttl" => "120",
    );

    $post_query = json_encode($postfields);
}
$url = "https://api.value-domain.com/v1";
$path = "/domains/$argv[2]/dns";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $path);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if ($method!=='GET') {
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_query);
  curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);//FIXME use http version 1.1
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);

$headers = array();
$headers[] = "Content-Type: application/json";
if ($method!=='GET') {
  $headers[] = 'Content-Length: ' . strlen($post_query);
}
$headers[] = 'Authorization: Bearer ' . $apikey;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
if (curl_errno($ch)) {
  echo 'Connection Error: ' . curl_errno($ch) . ' - ' . curl_error($ch);exit;
}
$info = curl_getinfo($ch);
print_r($response);

curl_close($ch);
?>

ETHの部分は、対象のIPが付いているNIC名を入れる。(ubuntuとかはens4とか)

/root/vapi.sh

#!/bin/bash

ETH=eth0
script=/root/vapi.php
IP=`ip -4 a | grep inet.*${ETH} | awk '{print $2}' | sed 's/\/.*//g'`

php $script ${CERTBOT_DOMAIN} ${CERTBOT_VALIDATION} ${IP}

sleep 120
exit $?

実行権限だけ付けておく

chmod 755 /root/vapi.sh

3.証明書取得

domain=hogehoge.com
mail=hoge@hogehoge.com
certbot certonly --manual \
      --preferred-challenges dns-01 \
      --server https://acme-v02.api.letsencrypt.org/directory \
      -m ${mail} \
      -d ${domain} \
      -d *.${domain} \
      --manual-auth-hook=/root/vapi.sh

4.証明書更新

certbot renew