johnpoint

johnpoint

(。・∀・)ノ゙嗨
github

SSL証明書関連のポリシーの改善

docker を基盤として使用して以来、統一的に管理できるパネルを作成しようと考えました。一方で、一般的に使用されているパネルは使用したくありませんでした(彼らの機能が私のニーズを満たしていないためです)。また、これは一種の練習でもあります

概要#

サイトの証明書を見てみましょう。はい!ワイルドカード証明書に変更しました〜
現在実装されている(バグだらけの)機能について簡単に説明します。証明書の配布については、前述のようにパネルで管理するため、パネルには getcerfile.php というファイルが組み込まれています(もちろん認証が必要です。証明書を公開するとまずいですからね)証明書は、Let's Encrypt でワイルドカード証明書を発行することを選択しましたので、証明書の発行時にどのサーバーに解析されるかを考える必要はありませんでした(車輪を再発明する必要はありませんでした)。

証明書の検証#

この部分は、Axton さんの影響を受けました。詳細はこの記事をご覧ください。また、私自身が比較的弱いため、現時点ではデータベースを使用したくありません。そのため、ファイルとシェルを使用して証明書のチェックを行い、PHP を使用して見た目の良いページに埋め込んでいます。

デモ画像:

image

うーん、アップロード中に自分の画像ホスティングが問題があるようです... 自分で作ることを考えますか?(とりあえず後で考えます)

以下がコードです:

#!/bin/sh

cat urlfile.list | while read line
do
  touch "data/$line"
  touch "data/$line.ca"
  curl https://$line -v -s -o /dev/null 2>"data/$line.ca"
  datee=$(date +'%F %H:%M')
  echo "最後のチェック: " $datee > "data/$line"

  data=$(cat "data/$line.ca" | grep 'subject:')
  echo "証明書のドメイン: " ${data##* subject: } >> "data/$line"

  data=$(cat "data/$line.ca" | grep 'start date:')
  data=$(date -d "${data##* start date: }" +'%F %H:%M:%S')
  echo "発行日: "${data} >> "data/$line"
  startdate=$data

  data=$(cat "data/$line.ca" | grep 'expire date: ')
  data=$(date -d "${data##* expire date: }" +'%F %H:%M:%S')
  echo "有効期限: " $data >> "data/$line"
  enddate=$data

  data=$(cat "data/$line.ca" | grep 'issuer: ')
  echo "発行元: "${data##* issuer: } >> "data/$line"

  data=$(cat "data/$line.ca" | grep 'SSL certificate verify ok.')
  echo "証明書の状態: "${data##* } >> "data/$line"

  startdate=$(date -d "${startdate}" +%s)
  enddate=$(date -d "${enddate}" +%s)
  datee=$(date -d "${datee}" +%s)

  long=$(($enddate-$startdate))
  datee=$(($datee-$startdate))
  datee=$(($datee*100))
  hundred=100
  persent=$(($datee/$long))

  echo "<div class=\"mdui-progress\"><div class=\"mdui-progress-determinate\" style=\"width: ${persent}%;\"></div></div>" >> "data/$line"

  rm "data/$line.ca"
done

以下が表示されるコードです:

<?php
include_once 'config.php';
if ($_COOKIE["user"] == md5($username.$userpasswd)) {
    echo '<div class="mdui-panel" mdui-panel>';
    function listDir($dir)
    {
        if (is_dir($dir)) {
            if ($dh = opendir($dir)) {
                while (($file = readdir($dh)) !== false) {
                    if ($file != "." && $file != "..") {
                        echo '<div class="mdui-panel-item">';
                        echo '<div class="mdui-panel-item-header">'.'<div class="mdui-panel-item-title">'.$file.'</div>'.'<i class="mdui-panel-item-arrow mdui-icon material-icons">keyboard_arrow_down</i>'.'</div>';
                        echo '<div class="mdui-panel-item-body">';
                        $myfile = fopen("$dir/$file", "r") or die("Unable to open file!");
                        while (!feof($myfile)) {
                            echo '<p>'.fgets($myfile) . '</p>';
                        }
                        echo '</div></div>';
                        fclose($myfile);
                    }
                }
                closedir($dh);
            }
        } else {
            echo $dir . '<br>';
        }
    }
    listDir("./data");
    echo '</div>';
} else {
    echo 'error';
}
?>

証明書の配布#

上記からもわかるように、ユーザー名とパスワードを md5 でハッシュ化して cookie に書き込み、認証を行っています。認証が必要なドメインは、urlfile.list ファイルに直接保存されます(私は本当に下手です)。

同様に、証明書の配布も cookie を使用して身元を確認します。

<?php
include_once 'config.php';
if ($_COOKIE["user"] == md5($username.$userpasswd)) {
    $myfile = fopen($_GET['file'], "r") or die("Unable to open file!");
    echo fread($myfile, filesize($_GET['file']));
    fclose($myfile);
} else {
    header("Location: /index.php");
}
?>

証明書ファイルを直接読み取り、出力します。同時に、nginx でディレクトリのアクセス権限を制御し、証明書の取得に使用します。

curl https://****/getcerfile.php?file=ssl/lvcshu.com/lvcshu.com.key -H 'cookie: user=???' > lvcshu.com.key

このように、証明書サーバーで定期的にスクリプトを実行して証明書を更新できます。また、ワイルドカード証明書は acme.sh を使用して自動更新されます。以上、もし何か問題があれば、お知らせください。QAQ
Telegram:@johnpoint

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。