Allow password to be passed to TLS context (#2719)
This commit is contained in:
parent
009954003c
commit
53820bc241
|
@ -159,7 +159,7 @@ class CertSimple(SanicSSLContext):
|
||||||
# try common aliases, rename to cert/key
|
# try common aliases, rename to cert/key
|
||||||
certfile = kw["cert"] = kw.pop("certificate", None) or cert
|
certfile = kw["cert"] = kw.pop("certificate", None) or cert
|
||||||
keyfile = kw["key"] = kw.pop("keyfile", None) or key
|
keyfile = kw["key"] = kw.pop("keyfile", None) or key
|
||||||
password = kw.pop("password", None)
|
password = kw.get("password", None)
|
||||||
if not certfile or not keyfile:
|
if not certfile or not keyfile:
|
||||||
raise ValueError("SSL dict needs filenames for cert and key.")
|
raise ValueError("SSL dict needs filenames for cert and key.")
|
||||||
subject = {}
|
subject = {}
|
||||||
|
|
|
@ -811,7 +811,7 @@ class StartupMixin(metaclass=SanicMeta):
|
||||||
ssl = kwargs.get("ssl")
|
ssl = kwargs.get("ssl")
|
||||||
|
|
||||||
if isinstance(ssl, SanicSSLContext):
|
if isinstance(ssl, SanicSSLContext):
|
||||||
kwargs["ssl"] = kwargs["ssl"].sanic
|
kwargs["ssl"] = ssl.sanic
|
||||||
|
|
||||||
manager = WorkerManager(
|
manager = WorkerManager(
|
||||||
primary.state.workers,
|
primary.state.workers,
|
||||||
|
|
19
tests/certs/password/fullchain.pem
Normal file
19
tests/certs/password/fullchain.pem
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDCTCCAfGgAwIBAgIUa7OOlAGQfXOgUgRENJ9GbUgO7kwwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwFDESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTIzMDMyMDA3MzE1M1oXDTIzMDQx
|
||||||
|
OTA3MzE1M1owFDESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEF
|
||||||
|
AAOCAQ8AMIIBCgKCAQEAn2/RqVpzO7GFrgVGiowR5CzcFzf1tSFti1K/WIGr/jsu
|
||||||
|
NP+1R3sim17pgg6SCOFnUMRS0KnDihkzoeP6z+0tFsrbCH4V1+fq0iud8WgYQrgD
|
||||||
|
3ttUcHrz04p7wsMoeqndUQoLbyJzP8MpA2XJsoacdIVkuLv2AESGXLhJym/e9HGN
|
||||||
|
g8bqdz25X0hVTczZW1FN9AZyWWVf9Go6jqC7LCaOnYXAnOkEy2/JHdkeNXYFZHB3
|
||||||
|
71UemfkCjfp0vlRV8pVpkBGMhRNFphBTfxdqeWiGQwVqrhaJO4M7DJlQHCAPY16P
|
||||||
|
o9ywnhLDhFHD7KIfTih9XxrdgTowqcwyGX3e3aJpTwIDAQABo1MwUTAdBgNVHQ4E
|
||||||
|
FgQU5NogMq6mRBeGl4i6hIuUlcR2bVEwHwYDVR0jBBgwFoAU5NogMq6mRBeGl4i6
|
||||||
|
hIuUlcR2bVEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAYW34
|
||||||
|
JY1kd0UO5HE41oxJD4PioQboXXX0al4RgKaUUsPykeHQbK0q0TSYAZLwRjooTVUO
|
||||||
|
Wvna5bU2mzyULqA2r/Cr/w4zb9xybO3SiHFHcU1RacouauHXROHwRm98i8A73xnH
|
||||||
|
vHws5BADr2ggnVcPNh4VOQ9ZvBlC7jhgpvMjqOEu5ZPCovhfZYfSsvBDHcD74ZYm
|
||||||
|
Di9DvqsJmrb23Dv3SUykm3W+Ql2q+JyjFj30rhD89CFwJ9iSlFwTYEwZLHA+mV6p
|
||||||
|
UKy3I3Fiht1Oc+nIivX5uhRSMbDVvDTVHbjjPujxxFjkiHXMjtwvwfg4Sb6du61q
|
||||||
|
AjBRFyXbNu4hZkkHOA==
|
||||||
|
-----END CERTIFICATE-----
|
30
tests/certs/password/privkey.pem
Normal file
30
tests/certs/password/privkey.pem
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||||
|
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
|
||||||
|
-----END ENCRYPTED PRIVATE KEY-----
|
|
@ -33,12 +33,19 @@ from sanic.response import text
|
||||||
|
|
||||||
current_dir = os.path.dirname(os.path.realpath(__file__))
|
current_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
localhost_dir = os.path.join(current_dir, "certs/localhost")
|
localhost_dir = os.path.join(current_dir, "certs/localhost")
|
||||||
|
password_dir = os.path.join(current_dir, "certs/password")
|
||||||
sanic_dir = os.path.join(current_dir, "certs/sanic.example")
|
sanic_dir = os.path.join(current_dir, "certs/sanic.example")
|
||||||
invalid_dir = os.path.join(current_dir, "certs/invalid.nonexist")
|
invalid_dir = os.path.join(current_dir, "certs/invalid.nonexist")
|
||||||
localhost_cert = os.path.join(localhost_dir, "fullchain.pem")
|
localhost_cert = os.path.join(localhost_dir, "fullchain.pem")
|
||||||
localhost_key = os.path.join(localhost_dir, "privkey.pem")
|
localhost_key = os.path.join(localhost_dir, "privkey.pem")
|
||||||
sanic_cert = os.path.join(sanic_dir, "fullchain.pem")
|
sanic_cert = os.path.join(sanic_dir, "fullchain.pem")
|
||||||
sanic_key = os.path.join(sanic_dir, "privkey.pem")
|
sanic_key = os.path.join(sanic_dir, "privkey.pem")
|
||||||
|
password_dict = {
|
||||||
|
"cert": os.path.join(password_dir, "fullchain.pem"),
|
||||||
|
"key": os.path.join(password_dir, "privkey.pem"),
|
||||||
|
"password": "password",
|
||||||
|
"names": ["localhost"],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -677,3 +684,34 @@ def test_ssl_in_multiprocess_mode(app: Sanic, caplog):
|
||||||
logging.INFO,
|
logging.INFO,
|
||||||
"Goin' Fast @ https://127.0.0.1:8000",
|
"Goin' Fast @ https://127.0.0.1:8000",
|
||||||
) in caplog.record_tuples
|
) in caplog.record_tuples
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
sys.platform not in ("linux", "darwin"),
|
||||||
|
reason="This test requires fork context",
|
||||||
|
)
|
||||||
|
def test_ssl_in_multiprocess_mode_password(
|
||||||
|
app: Sanic, caplog: pytest.LogCaptureFixture
|
||||||
|
):
|
||||||
|
event = Event()
|
||||||
|
|
||||||
|
@app.main_process_start
|
||||||
|
async def main_start(app: Sanic):
|
||||||
|
app.shared_ctx.event = event
|
||||||
|
|
||||||
|
@app.after_server_start
|
||||||
|
async def shutdown(app):
|
||||||
|
app.shared_ctx.event.set()
|
||||||
|
app.stop()
|
||||||
|
|
||||||
|
assert not event.is_set()
|
||||||
|
with use_context("fork"):
|
||||||
|
with caplog.at_level(logging.INFO):
|
||||||
|
app.run(ssl=password_dict)
|
||||||
|
assert event.is_set()
|
||||||
|
|
||||||
|
assert (
|
||||||
|
"sanic.root",
|
||||||
|
logging.INFO,
|
||||||
|
"Goin' Fast @ https://127.0.0.1:8000",
|
||||||
|
) in caplog.record_tuples
|
||||||
|
|
Loading…
Reference in New Issue
Block a user