Python에서 명령을 제출할 때 bash 대괄호를 따옴표로 묶을 수 있다는 것을 읽었습니다. 이 예에서는 셸에서 실행되는 명령을 사용하여 openssl에 대한 키와 csr을 생성하려고 하지만 Python에서 실행할 때는 생성하지 않습니다. 여러 가지 조합을 시도했지만 계속해서 다른 문제가 발생했습니다.
다음 Python 명령이 실패합니다.
import os
os.system('openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth"))')
기본 openssl 명령이 성공했습니다.
openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth"))
이것은 간단해야하지만 답을 찾을 수 없습니다.
답변1
<(…)
bash(및 ksh 및 zsh)에는 존재하지만 일반 sh에는 존재하지 않는 프로세스 교체입니다. 이 system
함수는 bash가 아닌 sh를 호출합니다.
파이프에서 프로세스 대체를 사용 openssl
하고 중첩된 프로세스 대체를 간단한 명령 시퀀스로 줄일 수 있습니다.
{ cat /etc/pki/tls/openssl.cnf;
printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth";
} | openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config -
(줄바꿈 선택사항)
답변2
당신의 답변에 감사드립니다. 나는 그것에 대해 생각하고 이것을 수행하는 Python 기본 방법을 찾기로 결정했습니다. 충분한 정보를 갖고 있다Python 암호화 치트 시트 웹사이트다른 사람들과 마찬가지로 Python 코드를 조합하여 CSR을 생성할 수 있었습니다.
requires pyOpenSSL
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend())
with open('mycert.key', 'wb') as f:
f.write(key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()))
from OpenSSL import crypto
# load private key
ftype = crypto.FILETYPE_PEM
with open('mycert.key', 'rb') as f: key = f.read()
key = crypto.load_privatekey(ftype, key)
req = crypto.X509Req()
alt_name = [ b"DNS:mynode",
b"DNS:myF5",
b"email:[email protected]" ]
key_usage = [ b"Digital Signature",
b"Key Encipherment" ]
key_usage = [ b"digitalSignature",
b"keyEncipherment" ]
ext_key_usage = [ b"serverAuth",
b"clientAuth" ]
# country (countryName, C)
# state or province name (stateOrProvinceName, ST)
# locality (locality, L)
# organization (organizationName, O)
# organizational unit (organizationalUnitName, OU)
# common name (commonName, CN)
req.get_subject().C = "US"
req.get_subject().ST = "Florida"
req.get_subject().L = "St Petersburg"
req.get_subject().O = "myCompany"
req.get_subject().OU = "MyOU"
req.get_subject().CN = "mynode"
req.add_extensions([
crypto.X509Extension( b"basicConstraints",
False,
b"CA:FALSE"),
crypto.X509Extension( b"keyUsage",
False,
b",".join(key_usage)),
crypto.X509Extension( b"subjectAltName",
False,
b",".join(alt_name))
])
req.set_pubkey(key)
req.sign(key, "sha256")
csr = crypto.dump_certificate_request(ftype, req)
with open("mycert.csr", 'wb') as f: f.write(csr)