web-dev-qa-db-ja.com

openssl.cnfのデフォルトの場所を決定する方法は?

バックグラウンド

私は、opensslを使用してX509v3拡張準拠サブジェクト代替名を使用して証明書署名要求を生成するbashスクリプトを作成しています。

これにはコマンドラインオプションがないため、 解決策-configオプションと-reqextsオプションは、SAN値をデフォルトの構成ファイルにインラインで追加します。

openssl req -new -sha256 -key domain.key -subj "/C=US/ST=CA/O=Acme, Inc./CN=example.com" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com")) -out domain.csr

質問

私の問題は移植性です。 同様の質問 は、デフォルトの構成ファイルが/etc/ssl/openssl.cnf、残念ながらこれはどこでも動作しません。Windowsが明らかな例です。

どうすればプログラマチックに opensslへのフルパスを決定しますか default 設定ファイル?

私が試したこと

documentation には明白なヒントがあります

-configファイル名
これにより、代替の構成ファイルを指定できます。これにより、コンパイル時のファイル名、またはOPENSSL_CONF環境変数で指定されたものが上書きされます。

config documentation を読んで source code を検索しましたが、「コンパイル時間」のデフォルト設定を読み込む場所を選択するメカニズムを見つけることができませんファイル。それを見つけることができたら、ハードコードされたパスではなく、変数としてスクリプトにロードすることを好みます。

さらに、私の$OPENSSL_CONF変数は空です。

悪い選択肢

現在、私のスクリプトはこれらの条件をチェックし、trueと評価される最初の条件を使用します。

  1. $OPENSSL_CONF変数が読み込まれ、ファイルが存在する
  2. /etc/ssl/openssl.cnf存在する

どちらにも当てはまらない場合は、標準構成のコピーが含まれています。これは、クライアントによって確立されたカスタム設定を実際にオーバーライドするため、望ましくありません。環境の条件を完全に使用し、補足としてSANセクションを追加するだけです。

通常の容疑者のパスまたはシステム検索でこのチェーンをさらに拡張できます。しかし、複数が存在する場合、実際にopensslがデフォルトとして使用している保証はありません。

13
Jeff Puckett

コメントの1つで述べたように、簡単な答えは次のコマンドを使用してパスを見つけることです。

openssl version -d

これが機能しない場合は、OpenSSLが正しく構成されていないか、少なくとも必要な構成がないと推測できます。以下に、openssl.cnfの場所を取得する方法に関するNode.jsの例を示します。

const util = require('util');
const path = require('path');
const exec = util.promisify(require('child_process').exec);

(async () => {
    const opensslCnfPath = path.normalize(`${(await exec('openssl version -d')).stdout.match(/"(.*)"/).pop()}/openssl.cnf`);
    console.log(opensslCnfPath);
})();
6