![문자열에 \n을 삽입하는 방법](https://linux55.com/image/176964/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%20%5Cn%EC%9D%84%20%EC%82%BD%EC%9E%85%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
데모 목적으로 개인 키를 생성하고 있습니다.
$ openssl genrsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvB8fZFRS83Kztend5KO9cnWXaqLWot0qLDeLcS8ly718FUdm
3VcCY5j737zz4iwmFf3b20Q2XxlbYC/M13wTJzHBf2d1mRDlpZq7CgX/JSEUW/Hr
uXiF6PI+ypkvskyoQcz04rlT8skd7tanXhXINnLwW7gCiNlxQQFkrpfO8Fkh+vYL
...
Ewac3GAh9CiMikQEYNxpsuLLboS4NcaQWiGB+1imtPtbp8Gf89pJSVBDubgza2Bb
rucNxP3HZtPd6G9CvkMJREYL7jHkXYa5DBzs9LB9mLB4b5H/6KN/fsfj
-----END RSA PRIVATE KEY-----
\n
제거해야 할 각 줄의 끝에 개행 문자가 있습니다. 모든 것을 한 줄에 모아서 환경 변수로 설정할 수 있기를 바랍니다. 참고: 여러 줄의 환경 변수는 지원되지 않기 .env
때문에 저장할 수 없습니다 .docker-compose
새 줄을 모두 제거했습니다.
$(openssl genrsa | tr -d '\n')
-----BEGIN RSA PRIVATE KEY-----MII...-----END RSA PRIVATE KEY-----
그런 다음 두 개의 개행 문자를 수동으로 삽입합니다 \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 컨테이너를 시작하면 위의 모든 작업이 예상대로 작동합니다.
두 개를 수동으로 삽입할 필요가 없도록 스크립트에 대한 도움이 필요합니다.\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-----
원하는 제품을 생산해 보세요.