@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Node.js のルート証明書

Node.js は独自のルート証明書ストアを持っており OS の証明書ストアを参照しないので自己署名証明書を使うサーバーとの通信でトラブルになることがある、などと知られているが、「Node.js は独自のルート証明書ストアを持っており OS の証明書ストアを参照しない」の根拠はどこに書いてあるのか。

おそらく Maintaining the root certificates が、この件に関する決定的な文書(source of truth)とみていいだろう。

Node.js contains a compiled-in set of root certificates used as trust anchors for TLS certificate validation.

The certificates come from Mozilla, specifically NSS's certdata.txt file.

The PEM encodings of the certificates are converted to C strings, and committed in src/node_root_certs.h.

src/node_root_certs.h と、その元データらしき tools/certdata.txt が「Node.js 独自のルート証明書ストア」の正体・実体だ。

調査の過程で、単に「Node.js は独自のルート証明書ストアを持っており OS の証明書ストアを参照しない」としか書いていない数多のページよりずっと有益な情報を提供しているページが見つかった。特に一つ目のページのおかげで node_root_certs.h というファイルと、それをもとに上記の文書にたどり着けた。

  • nodeが使うroot証明書はハードコードされてる。拡張方法が提供されるっぽいやりとりされていたが・・。
    • node_root_certs.hにいる

This answer is more focused towards package maintainers/builders.

One can use this method if you do not want end users to rely on additional environment variables.

When nodejs is built from source, it (by default, can be overridden) embeds the Mozilla CA certificate database into the binary itself. One can add more certificates to this database using the following commands:

# Convert your PEM certificate to DER
openssl x509 -in /path/to/your/CA.pem -outform der -out CA.der

# Add converted certificate to certdata
nss-addbuiltin -n "MyCompany-CA" -t "CT,C,C" < CA.der >> tools/certdata.txt

# Regenerate src/node_root_certs.h header file
perl tools/mk-ca-bundle.pl

# Finally, compile
make install

Nodeは、Mozillaが管理しているルート証明書データをNodeのソース内に埋め込んで利用しています。