Pistolfly のすべての投稿

Software Engineer in Tokyo, Japan

subjectAltNameが設定されていない証明書はChromeで NET::ERR_CERT_COMMON_NAME_INVALID エラー

開発環境用に自己署名のSSL証明書を使っているサイトにChromeでアクセスしたら、
「この接続ではプライバシーが保護されません NET::ERR_CERT_COMMON_NAME_INVALID」というエラーになった。

自己署名証明書(Self-signed certificate)だが、クライアント側はMacではキーチェーンアクセスに登録してx.509基本ポリシーを「常に信頼」にしているし、Windowsでは「コンピューター証明書の管理」で「信頼されたルート証明機関」に登録してある。
CN(Common Name)とアクセスしているホスト名も一致している。

Chrome以外のブラウザでは問題ない。
Chromeでも問題なくアクセスできていたが、急にエラーになるようになった。

エラーメッセージに「このサーバーのセキュリティ証明書は[missing_subjectAltName]から発行されています。」とあるので、subjectAltNameが設定されていないのが原因っぽい。

原因

Chrome 58 以降で、ドメイン名と証明書の照合にcommonNameが使われず、subjectAlternativeNameのみを使用するようになった。(ただし、Chrome 65 までは、EnableCommonNameFallbackForLocalAnchorsを設定すればcommonNameを使用できるらしい。)

https://support.google.com/chrome/a/answer/7391219?hl=en

解決方法

subjectAltNameを設定した自己署名証明書を作成する

openssl.cnfをコピーしたファイルにsubjectAltNameを設定して証明書作成時に指定する。

  1. openssl.cnfをコピー(下記はRedhat系の例。openssl.cnfの場所は環境によって読み替える。)
    $ cp /etc/pki/tls/openssl.cnf my-server.example.com.cnf
    
  2. コピーした設定ファイルのreqセクションのx509_extensionsがv3_caになっているので、v3_caセクションにsubjectAltNameを追加すればよさそうだ。
    $ vi my-server.example.com.cnf
    
    [ req ]
    ...
    x509_extensions = v3_ca # The extentions to add to the self signed cert
    ...
    

    v3_caセクションにsubjectAltNameを設定

    [ v3_ca ]
    ...
    subjectAltName=DNS.1:my-server.example.com
    ...
    

    subjectAltNameを複数設定することもできる。

    subjectAltName=DNS.1:my-server.example.com,DNS.2:my-server2.example.com
    

    詳しくは、`man 5 x509v3_config` を参照。

  3. 秘密鍵の作成
    $ openssl genrsa -out my-server.example.com.key 2048
    
  4. 証明書の作成(-configに作成した設定ファイルを指定する
    $ openssl req -new -x509 -days 36500 -sha256 -config my-server.example.com.cnf -key my-server.example.com.key -out my-server.example.com.crt
    

CentOS6にsclのdevtoolsetをインストール

CentOS6でnodejs(v6.9.1)をビルドしようとしたら、makeでエラーになった。
gccとg++の4.8以降が必要だが、CentOS6のgccは4.4.7だからだ。

node-v6.9.1/BUILDING.md

Prerequisites:

* `gcc` and `g++` 4.8 or newer, or
* `clang` and `clang++` 3.4 or newer
* Python 2.6 or 2.7
* GNU Make 3.81 or newer

そこで、sclでgccとg++の4.8以降をインストールしてビルドすることにした。

$ sudo yum install centos-release-scl
$ sudo yum install scl-utils
$ sudo yum install devtoolset-4-gcc devtoolset-4-gcc-c++ devtoolset-4-binutils
$ scl enable devtoolset-4 bash
$ gcc --version
gcc (GCC) 5.2.1 20150902 (Red Hat 5.2.1-2)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

devtoolset-3、devtoolset-4がある。devtoolset-4にしてみた。
devtoolset-4で全部インストールすると大量なので、nodejsのビルドに必要なgcc、g++とbinutilsのみインストールした。

$ scl enable < コレクション1> [< コレクション2> ...] bash

で、インストールしたコレクションが利用できる環境がセットされたbashが起動する。

Mac OS XのtopはCPU順でない

Mac OS XのtopはデフォルトがCPU順でない。pidの降順となっている。
ソートを変更するには、

$ top -o cpu

または

$ top -o -cpu

で起動するか、top起動後に、o と入力後、cpu(または-cpu) と入力してReturnキーを押す。

+を付けると昇順になる。

その他のソート可能項目については、man top を参照。

CentOS 6.7のyum updateでエラー `http://mirror.centos.org/centos/6/SCL/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"`

CentOS release 6.7 (Final)

yum updateで以下のエラー

http://mirror.centos.org/centos/6/SCL/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
他のミラーを試します。
エラー: Cannot retrieve repository metadata (repomd.xml) for repository: scl. Please verify its path and try again

解決方法

$ sudo yum remove centos-release-SCL
$ sudo yum update # CentOS-6.8にアップデート
$ sudo yum install centos-release-scl
$ sudo yum update

情報源: 0010925: Yum update fails on a 404 returned from http://mirror.centos.org/centos/6/SCL/x86_64/repodata/repomd.xml - CentOS Bug Tracker

Androidアプリのパッケージファイル(apk)を実機にインストールする

adb install -r <apkのパス>
  • -rは、既存のアプリを上書きする。
  • 複数のデバイスが接続されている場合は、-s オプションでデバイスのシリアル番号を指定する。
    デバイスのシリアル番号は、

    $ adb devices
    

    で確認できる。

例:

$ adb -s emulator-5554 install -r /Users/pistolfly/AndroidstudioProjects/MyApp/app/app-release.apk

Androidエミュレータや実機にテキストをペーストする

$ adb shell input text 'ペーストしたい文字列'
  • adbのパスは、Android StudioのProject SturctureのSDK Locationで確認して、環境変数PATHに加えておく。
  • 複数のデバイスが接続されている場合は、-s オプションでデバイスのシリアル番号を指定する。
    デバイスのシリアル番号は、

    $ adb devices
    

    で確認できる。

例:

$ adb -s emulator-5554 shell input text 'ペーストしたい文字列'

CentOS7でpassenger-configやpassenger-statusがエラーになる

CentOS7でpassenger-configやpassenger-statusがエラーになる。

CentOS Linux release 7.2.1511 (Core)
Apache/2.4.6 (CentOS)
Phusion Passenger 5.0.23 (passenger-install-apache2-moduleでインストール)

$ passenger-config restart-app
*** ERROR: Phusion Passenger doesn't seem to be running. If you are sure that it
is running, then the causes of this problem could be one of:

 1. You customized the instance registry directory using Apache's
    PassengerInstanceRegistryDir option, Nginx's
    passenger_instance_registry_dir option, or Phusion Passenger Standalone's
    --instance-registry-dir command line argument. If so, please set the
    environment variable PASSENGER_INSTANCE_REGISTRY_DIR to that directory
    and run this command again.
 2. The instance directory has been removed by an operating system background
    service. Please set a different instance registry directory using Apache's
    PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir
    option, or Phusion Passenger Standalone's --instance-registry-dir command
    line argument.

原因

Passengerのinstance registry directory(Apacheの場合はPassengerInstanceRegistryDir、Nginxの場合はpassenger_instance_registry_dir)が見つからないのが原因。
instance registry directoryを明示的に指定していない場合のデフォルトは/tmpなので、instance registry directoryは/tmp下に作成されるが、SystemdのPrivateTmpオプションがhttpdで有効になっている(デフォルト)ため、httpd専用の/tmp(実際には/tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-httpd.service-XXXXXX/tmp)に作成される。このディレクトリが、別プロセスであるpassenger-configやpassenger-statusには見つけられないのだ。

SystemdのPrivateTmpによって発生する問題なので、RHEL7でも同様だろう。

解決方法1: PassengerInstanceRegistryDirを明示的に指定する

PrivateTmpは有効にしたままで対処する方法。
Passengerのinstance registry directoryがhttpd専用の/tmpに作成されないように、明示的に指定する。

(Apacheの場合)
/etc/httpd/conf/httpd.conf

PassengerInstanceRegistryDir /var/run/passenger-instreg

/var/run(=/run)に置くファイル、ディレクトリは、再起動すると削除されてしまうので、tmpfiles.dに設定が必要。
詳細は、man 5 tmpfiles.d を参照。

/etc/tmpfiles.d/passenger.conf

D /var/run/passenger-instreg 0755 root root

passenger-status、passenger-configを実行するユーザにPASSENGER_INSTANCE_REGISTRY_DIRの設定が必要。

~/.bash_profile

export PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger-instreg

capistrano-passengerを使用している場合は、デプロイ後のpassenger-config restart-appでPASSENGER_INSTANCE_REGISTRY_DIRの指定が必要なので、該当するステージのデプロイレシピに以下を追加する。

set :default_env, {
  ...(略)..,
  "PASSENGER_INSTANCE_REGISTRY_DIR" => "/var/run/passenger-instreg"
}

以上を設定したら、システムを再起動する。

解決方法2: httpd.serviceのPrivateTmpを無効にする

httpdのPrivateTmpを無効にしてしまう方法。
/usr/lib/systemd/system/httpd.service を /etc/systemd/system にコピーすると、/etc/systemd/system に置いたファイルが優先される。コピーしたhttpd.serviceのPrivateTmpをfalseに変更する。

/etc/systemd/system/httpd.service

...(略)
PrivateTmp=false
...(略)

変更後、

$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

情報源: CentOS 7 で Phusion Passenger の passenger-status を実行するとエラーとなる - Qiita
お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita
Handle systemd PrivateTmp #1475
Systemd入門(5) - PrivateTmpの実装を見る - めもめも