この問題は、Git forWindowsパッケージの一部として一般的に使用されているMinGW / MSYSに固有のものです。
解決策は、-subj
引数を先頭//
(二重スラッシュ)で渡し、次に\
(バックスラッシュ)を使用してキーと値のペアを区切ることです。このような:
"//O=Org\CN=Name"
これはopenssl
、期待される形式で魔法のように渡されます。
"/O=Org/CN=Name"
したがって、特定の質問に答えるには-subj
、スクリプトの行を次のように変更する必要があります。
-subj "//C=GB\ST=someplace\L=Provo\O=Achme\CN=${FQDN}"
必要なのはそれだけです。
この魔法は何ですか?
ここで何が起こっているのか正確に知りたい人のために、私はこの謎を説明することができます。その理由は、MSYSは、スラッシュを含む引数が実際にはパスであると合理的に想定しているためです。そして、これらの引数がMSYS用に特別にコンパイルされていない実行可能ファイル(openssl
この場合のように)に渡されると、POSIXパスがWin32パスに変換されます。MSYSは相互運用性の最も一般的なシナリオをカバーするために最善を尽くしているため、この変換のルールは非常に複雑です。これは、魔法の変換が行われないためopenssl
、Windowsコマンドプロンプト(cmd.exe
)からの使用が正常に機能する理由も説明しています。
このように変換をテストできます。
$ cmd //c echo "/CN=Name"
"C:/Program Files (x86)/Git/CN=Name"
echo
MSYS用にコンパイルされているため、MSYSに付属の実行可能ファイルを使用することはできません。代わりに、echo
組み込みのを使用しますcmd
。cmd
スイッチは/
(Windowsコマンドで一般的)で始まるため、ダブルスラッシュで処理する必要があることに注意してください。出力でわかるように、引数はWindowsパスに展開され、なぜopenssl
実際にそれを主張するのかが明らかになりSubject does not start with '/'.
ます。
さらにいくつかの変換を見てみましょう。
$ cmd //c echo "//CN=Name"
/CN=Name
二重スラッシュにより、MSYSは、引数がWindowsスタイルのスイッチであると信じて、結果としてストリッピング/
のみ(パス変換なし)になります。これにより、スラッシュを使用してキーと値のペアを追加できると思うでしょう。それを試してみましょう。
$ cmd //c echo "//O=Org/CN=Name"
//O=Org/CN=Name
突然、開始時の二重スラッシュが削除されません。これは、最初の二重スラッシュの後にスラッシュが付いているため、MSYSはUNCパス(例:// server / path)を参照していると見なしているためです。これが渡された場合openssl
、最初のキー/値をスキップしてSubject Attribute /O has no known NID, skipped
。
この動作を説明するMinGWwikiの関連ルールは次のとおりです。
- 2つ以上の/で始まる引数は、エスケープされたWindowsスタイルのスイッチと見なされ、先頭の/が削除され、すべての\が/に変更されて渡されます。
- /の先頭ブロックの後に/がある場合を除いて、引数はUNCパスと見なされ、先頭の/は削除されません。
このルールでは、必要な引数を作成するために使用できるメソッドを確認できます。で\
始まる引数に続くものはすべて//
プレーンに変換されるためです/
。それを試してみましょう。
$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name
そして、私たちが見ることができるように、それは機能します。
これが魔法を少しわかりやすくすることを願っています。
cat -vet /path/to/script
で印刷してみて、行が「^ M $」(Windowsスタイル)で終わるのか、「$」(unixスタイル)だけで終わるのかを確認してください。