文字列に\ nを挿入する方法

文字列に\ nを挿入する方法

デモ目的で秘密鍵を生成しています。

$ openssl genrsa

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvB8fZFRS83Kztend5KO9cnWXaqLWot0qLDeLcS8ly718FUdm
3VcCY5j737zz4iwmFf3b20Q2XxlbYC/M13wTJzHBf2d1mRDlpZq7CgX/JSEUW/Hr
uXiF6PI+ypkvskyoQcz04rlT8skd7tanXhXINnLwW7gCiNlxQQFkrpfO8Fkh+vYL
...
Ewac3GAh9CiMikQEYNxpsuLLboS4NcaQWiGB+1imtPtbp8Gf89pJSVBDubgza2Bb
rucNxP3HZtPd6G9CvkMJREYL7jHkXYa5DBzs9LB9mLB4b5H/6KN/fsfj
-----END RSA PRIVATE KEY-----

\n削除する各行の末尾に改行文字があります。すべてを1行にまとめて環境変数に設定できることを願っています。注:複数行の環境変数はサポートされていない.envため保存できません。docker-compose

新しい行をすべて削除しました。

$(openssl genrsa | tr -d '\n')

-----BEGIN RSA PRIVATE KEY-----MII...-----END RSA PRIVATE KEY-----

次に、2つの改行文字を手動で挿入します\n。これをスクリプトで自動化しようとしています(したがって、この記事)。そうしないと、JWT署名は失敗します。

-----BEGIN RSA PRIVATE KEY-----\nMII...\n-----END RSA PRIVATE KEY-----

.envファイルで定義します。

JWT_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMII...\n-----END RSA PRIVATE KEY-----

ノードとドットフ私は次のようにアクセスします。

privateRsaKey = process.env.JWT_PRIVATE_KEY.replace(/\\n/gm, '\n'),

これで、privateRsaKey次のようになります。

-----BEGIN RSA PRIVATE KEY-----
MII...
-----END RSA PRIVATE KEY-----

さて、実際に秘密鍵を使って署名します。JWT

const signed = jwt.sign(payload, privateRsaKey, { 
  algorithm: 'RS256',
  ...
});

Dockerコンテナを起動すると、上記のすべての操作が期待どおりに機能します。

2つを手動で挿入する必要がないように、スクリプトの助けが必要です。\n

あなたの助けと忍耐に感謝します。本当にありがとうございます。

答え1

改行文字をに置き換えると、改行文字または生の改行文字になる可能性がある\nため、結果があいまいになります。入力が含まれていないため、この特別な場合は問題になりませんが、許可されている場合はコメントを含めることができるいくつかのPEM形式を含む他の多くの場合は問題になります。\n\n\n\n

転送メカニズムを介してデータを渡す一般的な方法(あなたの場合はDockerコンテナに保存)は、Base64でエンコードすることです。 Base64エンコーディングには、ASCII文字(大文字と小文字)、数字、句読点の3つのみが含まれます+/=。スペースは重要ではありません。改行なしでエンコード:

private_key="$(openssl genrsa)"
export encoded_private_key="$(printf '%s\n' "$private_key" | base64 | tr -d '\n')"

デコード:

private_key=$(echo "$encoded_private_key" | base64 -d)

または

echo "$encoded_private_key" | base64 -d >private_key.pem

答え2

Shellの専門家がこれをより簡単にします。しかし、私の意見は次のとおりです。

openssl genrsa 2>/dev/null | awk '{ if ($0~"BEGIN RSA") {ORS="\\n"; print} else {if ($0~"END RSA") {print "\\n"; print} else {ORS=""; print}}}'

-----BEGIN RSA PRIVATE KEY-----
MIIE....skipped
-----END RSA PRIVATE KEY-----

ご希望の製品を生産してみてください。

関連情報