follow us in feedly

2017年11月

Let’s EncryptをNginxに設定して常時SSL化する

本ブログの常時SSL化対応が完了しました。
約3年ぶりにブログ再開したことと、Let’s Encryptを試す機会になるということで
ずっと温めていたタスクの実行に踏み切ることができました。
Nginxの設定にはほぼ触れず、Let’s Encryptに関わる内容のみですが紹介していきます。

環境

  • CentOS 6.9
  • Nginx 1.12.2
  • Certbot 0.19.0

Certbotのダウンロード & 実行

クライアントソフトウェアのCertbotをダウンロードして実行し、証明書を取得します。

$ cd /usr/local/bin
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x certbot-auto
$ sudo ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

エラーが発生

下記のエラーが発生しました。

certbot-auto: line 864: virtualenv: コマンドが見つかりません

対策

Python 2.7が必要なのでインストールして、その環境下でCertbotを実行します。

$ sudo yum install centos-release-scl
$ sudo yum install python27 python27-python-tools
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

別のエラーが発生

新たに下記のエラーが発生しました。

...
IMPORTANT NOTES:
 - The following errors were reported by the server:

Domain: blog.77dogs.net
   Type:   unauthorized
   Detail: Invalid response from
   http://54.92.40.15/.well-known/acme-challenge/fCmuZYV6nsMPOb_nAvTkH45be_DFHLxvvLuyXUCPrSg:
   "<html>
   <head><title>403 Forbidden</title></head>
   <body bgcolor="
white">
   <center>

<h1>403 Forbidden</h1>

</center>

<hr>

<center>"


To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
...

対策

/.well-known以下にアクセスできないので、本ブログのNginx設定ファイルに追記します。

<br />
location ^~ /.well-known/ {
  log_not_found off;
  access_log    off;
  autoindex     off;
  try_files     $uri $uri/ =404;
}

Nginxを再起動して、Certbotを再実行します。
これで証明書の取得は完了です。

$ sudo service nginx restart
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

Nginxの設定

証明書が取得できたので、NginxにSSL設定をします。
Qualys SSL Labsの評価をA+にする設定をしてみました。
詳しい設定方法は書かないので参考サイトを参照してください。

自動更新設定

最後に、自動更新するようにcronの設定をします。
毎週日曜の23時に起動するように設定しました。
更新がなければ特に何もおこなわれません。

0 23 * * 0 /usr/bin/scl enable python27 "/usr/local/bin/certbot-auto renew -q --post-hook '/sbin/service nginx reload'"

まとめ

Let’s Encryptの証明書による常時SSL化の手順をご紹介しました。
証明書関連はほとんどCertbotがやってくれるので割りと簡単にできたように思います。
Nginxの設定については他サイトに任せていますが、参考になれば幸いです。

参考

MSYS2のpacmanで発生するGPGME errorの対応

Windowsでコマンドラインやターミナル環境を整えるためにMSYS2をインストールしました。
最近はWindowsで開発する機会もあったので作業環境を慣れた形にしたかったからです。
今回はMSYS2のパッケージ管理システムであるpacmanの初期設定に苦しむことに。
そのエラーと対応した内容をご紹介します。

環境

  • Windows 7
  • MSYS2 (mintty 2.8.1)
  • pacman 5.0.1

MSYS2のインストール

MSYS2のインストールはインストーラを実行して進めるだけなので簡単です。
詳しいインストール手順は、参考サイトを参照してください。

proxyの設定

proxy環境下で利用するので、C:/msys64/etc/profile.d/proxy.shを設定します。


export http_proxy=proxyserver.domain:port
export HTTP_PROXY=proxyserver.domain:port
export https_proxy=proxyserver.domain:port
export HTTPS_PROXY=proxyserver.domain:port
export no_proxy="localhost,127.0.0.1"
export NO_PROXY="localhost,127.0.0.1"

C:/msys64/etc/pacman.confを設定してcurlを使うようにします。


XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントを外す

pacmanの初期設定時にエラーが発生する

MSYS2のインストールが完了したら、pacmanの設定をします。
リポジトリの更新や既存パッケージのアップデートです。
ここで下記エラーが発生しました。

エラー内容


$ pacman -Sy
:: パッケージデータベースの同期中...
エラー: GPGME error: データがありません
エラー: mingw32 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: mingw64 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: msys の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: データベースの同期に失敗しました
エラー: 処理を始められませんでした (無効または破損したデータベース (PGP 鍵))

調べるために英語でも出力したので載せておきます。


$ pacman -Sy
:: Synchronizing package databases...
error: GPGME error: No data
error: failed to update mingw32 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update mingw64 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update msys (invalid or corrupted database (PGP signature))
error: failed to synchronize any databases
error: failed to init transaction (invalid or corrupted database (PGP signature))

解決方法がなかなか見つからない

上記エラーで調べるといろいろ情報は出てきます。
ただ、自分の場合は原因が違うようで、解決には至らずハマりました。
参考にした情報の一部を載せておきます。 (内容が同じようなものもあると思います)

curlではなくwgetを利用したら解決した

解決できたのは、wgetを使う設定にしてみたことでした。
proxyの設定時に有効にしていたcurlがダメだったようです。
proxy環境の都合なのか理由はわからないままですが。

とりあえず、C:/msys64/etc/pacman.confを下記のようにして無事に動作しました。
なんとなく設定を変えてみたら、あっさり解決することもありますよね。


#XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントアウトする
XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u # コメントを外す

まとめ

MSYS2のパッケージ管理システムであるpacmanのエラーと対応方法をご紹介しました。
pacmanがダウンロード時に利用するコマンドをcurlではなくwgetにすることで解決しました。
調べるといろいろな解決手段があるようなので、そのひとつとして参考なれば幸いです。

おまけ

MSYS2をちょっと快適に使えるかもしれない設定をします。
下記設定でシンボリックリンクの作成とWindowsの環境変数Pathの引き継ぎができるようになります。

C:/msys64/msys2.iniを編集します。


MSYS=winsymlinks:nativestrict # コメント外す シンボリックリンクの作成
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|&lt;process-id&gt;
#CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit # コメント外す 環境変数引き継ぎ
MSYSTEM=MSYS

参考

Windows7のget-pip.pyで発生したエラーに対処する

前回記事にあるとおり、Windows上でPythonを使うことになりました。
ついでにPythonのパッケージ管理システムであるpipをインストールすることにしたのですが
ちょっとしたエラーが発生してすんなりとはいかなかったので対応方法をご紹介します。

環境

  • Windows 7
  • Python 3.6.3

get-pip.pyがエラーで動かない

ドキュメントに従ってインストールを試みるも下記エラーが発生。

エラー内容


Traceback (most recent call last):
  File "get-pip.py", line 20061, in &lt;module&gt;
    main()
  File "get-pip.py", line 194, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\__init__.py", line 26, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\utils\__init__.py", line 23, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\locations.py", line 88, in &lt;module&gt;
  File "ntpath.py", line 75, in join
TypeError: expected str, bytes or os.PathLike object, not NoneType

対応方法

C:\python\python36._pthを編集します。
下記のようにコメントをはずして、siteモジュールをインポートするように設定します。
該当設定の直上コメントにも、”Uncomment”と書いてありますね。


python36.zip
.

# Uncomment to run site.main() automatically
import site # ←コメントをはずす

再実行

再度実行します。無事にインストールが完了しました。
プロキシ環境下での実行なのでオプションを付けています。


$ python get-pip.py --proxy="[user:passwd@]proxy.server:port"
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading setuptools-36.5.0-py2.py3-none-any.whl (478kB)
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-36.5.0 wheel-0.30.0

まとめ

pipのインストール時に発生したエラーの対応方法をご紹介しました。
「import site」のコメントをはずすことで解消されます。
proxyオプションとあわせて参考なれば幸いです。

参考

pip — pip 9.0.1 documentation
python 3.6 embed cannot get pip · Issue #7 · pypa/get-pip