66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
from os.path import join, exists
|
|
from re import sub
|
|
from cryptography.hazmat.primitives import serialization as crypto_serialization
|
|
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
from base64 import b64decode
|
|
|
|
|
|
defaults = {
|
|
'apt': {
|
|
'packages': {
|
|
'opendkim': {},
|
|
'opendkim-tools': {},
|
|
},
|
|
},
|
|
'opendkim': {
|
|
'keys': {},
|
|
},
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'opendkim/keys',
|
|
)
|
|
def keys(metadata):
|
|
keys = {}
|
|
|
|
for domain in metadata.get('mailserver/domains'):
|
|
privkey = repo.libs.rsa.generate_deterministic_rsa_private_key(
|
|
b64decode(str(repo.vault.random_bytes_as_base64_for('dkim' + domain)))
|
|
)
|
|
keys[domain] = {
|
|
'private': privkey.private_bytes(
|
|
crypto_serialization.Encoding.PEM,
|
|
crypto_serialization.PrivateFormat.PKCS8,
|
|
crypto_serialization.NoEncryption()
|
|
).decode(),
|
|
'public': ''.join(
|
|
privkey.public_key().public_bytes(
|
|
crypto_serialization.Encoding.PEM,
|
|
crypto_serialization.PublicFormat.SubjectPublicKeyInfo
|
|
).decode().split('\n')[1:-2]
|
|
),
|
|
}
|
|
|
|
return {
|
|
'opendkim': {
|
|
'keys': keys,
|
|
}
|
|
}
|
|
|
|
|
|
@metadata_reactor.provides(
|
|
'dns',
|
|
)
|
|
def dns(metadata):
|
|
dns = {}
|
|
|
|
for domain, keys in metadata.get('opendkim/keys').items():
|
|
raw_key = sub('^ssh-rsa ', '', keys['public'])
|
|
dns[f'mail._domainkey.{domain}'] = {
|
|
'TXT': [f'v=DKIM1; k=rsa; p={raw_key}'],
|
|
}
|
|
|
|
return {
|
|
'dns': dns,
|
|
}
|