문자열에 \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제거해야 할 각 줄의 끝에 개행 문자가 있습니다. 모든 것을 한 줄에 모아서 환경 변수로 설정할 수 있기를 바랍니다. 참고: 여러 줄의 환경 변수는 지원되지 않기 .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-----

원하는 제품을 생산해 보세요.

관련 정보