이 문제는 일반적으로 일부로 사용되는 MinGW / MSYS 에만 해당됩니다 . Windows 용 Git 패키지의 .
해결책은 -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
.
다음은 이 동작을 설명 하는 MinGW 위키 의 관련 규칙입니다 .
- 2 개 이상의 /로 시작하는 인수는 이스케이프 된 Windows 스타일 스위치로 간주되며 선행 / 제거되고 모든 \가 /로 변경된 상태로 전달됩니다.
- /의 선행 블록 뒤에 /가있는 경우를 제외하고는 인수는 UNC 경로로 간주되고 선행 /는 제거되지 않습니다.
이 규칙에서 원하는 인수를 생성하는 데 사용할 수있는 방법을 볼 수 있습니다. 로 \
시작하는 인수 뒤에 오는 모든 것은 //
plain으로 변환되기 때문 /
입니다. 그것을 시도해 봅시다.
$ cmd //c echo "//O=Org\CN=Name"
/O=Org/CN=Name
그리고 우리가 볼 수 있듯이 작동합니다.
이것이 마법을 조금 이해하기를 바랍니다.
cat -vet /path/to/script
행이 '^ M $'(Windows 스타일) 또는 '$'(unix 스타일)로 끝나는 지 확인하십시오.