Letsencrypt mail servernek

 ( gee | 2017. június 29., csütörtök - 1:05 )

Ezen egy ideje rágódom, de nem találtam jó megoldást.

Van egy gép, linux, netfilter, publikus IP cím.
Bejövő smtp, submission, pop3, imaps kapcsolódásokat egy másik gépre továbbítja: linux, postfix, dovecot.
Bejövő http és https kéréseket egy harmadik gépre: windows, valami webserver.

A mail serveren lejárt a startcom cert.

Szeretnék helyette letsencryptet, de ami példákat eddig láttam, mind http-t akart használni. Az meg nem jut el a géphez.

Valaki belefutott ebbe már?

Valami jó ötlet?

Nekem csak az jutott így hirtelen az eszembe, hogy a win gépre menjen egy letsencrypt és aztán az új fájlt kézzel majd valaki áthozza. De ez azért gáz.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Igen, és nem kötelező a HTTP, megy pl. DNS-alapon is.

Erről hol találok valami követhető leírást?

Amit eddig néztem, az ACME protokol leíráson kívül minden csak http-ről beszélt.
A protokol leírásban láttam DNS challenge-et, de mintha annak is a gépről kéne mennie gyorsan. Gondolom, ez akkor lenne járható út, ha azon a gépen futna egy bind vagy valami named, aminek a zóna fájljába a script belefirkálhatna.

Ez nem lehetetlen, de jelenleg nem így van megoldva, hanem a szolgáltatónál van a zóna definíció, és manuális és nehézkes a módosítása.

szerk: aha, látom, a következő hozzászólásban le is írtad. :-)

#!/bin/sh
certbot certonly -n --keep --agree-tos --manual --email postmaster@example.com \
--preferred-challenges=dns --manual-public-ip-logging-ok \
--manual-auth-hook /etc/ssl/certbot/authenticator.sh \
--manual-cleanup-hook /etc/ssl/certbot/cleanup.sh \
-d mail.example.com -d mail1.example.com

authenticator.sh:
#!/bin/sh

#CERTBOT_DOMAIN: The domain being authenticated
#CERTBOT_VALIDATION: The validation string

DIR=$(dirname $0)
DNSDIR=/var/named/external
DNSRELOAD="/etc/init.d/named.external reload"

[ -z "${CERTBOT_DOMAIN}" -o -z "${CERTBOT_VALIDATION}" ] && echo "Missing environment parameters" && exit 1

SUBDOMAIN="${CERTBOT_DOMAIN%%.*}"
DOMAIN="${CERTBOT_DOMAIN#*.}"

CERTBOTFILE="${DNSDIR}/certbot.${DOMAIN}"
SOAFILE="${DNSDIR}/soa.${DOMAIN}"

[ ! -f "${CERTBOTFILE}" ] && echo "Missing certbot file for domain ${DOMAIN}: ${CERTBOTFILE}" && exit 1
[ ! -f "${SOAFILE}" ] && echo "Missing SOA file for domain ${DOMAIN}: ${SOAFILE}" && exit 1

"$DIR/replace.pl" "${CERTBOTFILE}" "${SOAFILE}" "_acme-challenge.${SUBDOMAIN}" "${CERTBOT_VALIDATION}"

$DNSRELOAD
sleep 10

A cleanup.sh ugyanez, csak a replace.pl hivásának utolsó paramétere meg a sleep 10 kimarad.
A sleep 10 a secondary frissülése miatt van benne, nálam ennyi elég, de ehhez ugye kell a notification-alapú azonnali frissülés. A korrekt megoldás amúgy a visszaellenőrzés lenne dig segítségével.

replace.pl:
#!/usr/bin/perl -w

use strict;
use POSIX;

my $zonefile = $ARGV[0];
my $soafile = $ARGV[1];
my $label = $ARGV[2];
my $txt = $ARGV[3];

if (! defined $zonefile || $zonefile eq '' ||
! defined $soafile || $soafile eq '' ||
! defined $label || $label eq '') {
print "Usage: $0 <zone file name> <soa file name> <DNS label> [<txt value>]\n";
exit 1;
}

my $zonetempfile = $zonefile.'.tmp.'.$$;
my $soatempfile = $soafile.'.tmp.'.$$;

if (! open(ZONE, '<', $zonefile)) {
print "Error opening zone file $zonefile: $!\n";
exit 2;
}
if (! open(ZONETEMP, '>', $zonetempfile)) {
print "Error opening zone temp file $zonetempfile: $!\n";
close(ZONE);
exit 2;
}
while (<ZONE>) {
chomp;
if (/^\s*(\S+)/o) {
next if $1 eq $label;
print $1."\n";
}
print ZONETEMP $_."\n";
}
print ZONETEMP $label.' 300 IN TXT "'.$txt.'"'."\n" if defined $txt;
close(ZONETEMP);
close(ZONE);
if (! rename($zonetempfile, $zonefile)) {
print "Error renaming zone temp file $zonetempfile to $zonefile: $!\n";
exit 2;
}

my $state = 0;
if (! open(SOA, '<', $soafile)) {
print "Error opening zone file $soafile: $!\n";
exit 2;
}
if (! open(SOATEMP, '>', $soatempfile)) {
print "Error opening zone temp file $soatempfile: $!\n";
close(SOA);
exit 2;
}
while (<SOA>) {
chomp;
if ($state == 0 && /\(/o) {
$state = 1;
}
elsif ($state == 1 && /(\d+)/o) {
$state = 2;
my $serial = $1;
my $next = $serial + 1;
my $minimum = strftime('%Y%m%d01', localtime);
$next = $minimum if $next < $minimum;
s/\d+/$next/e;
}
print SOATEMP $_."\n";
}
close(SOATEMP);
close(SOA);
if (! rename($soatempfile, $soafile)) {
print "Error renaming zone temp file $soatempfile to $soafile: $!\n";
exit 2;
}

exit 0;

db.example.com:
$TTL 86400
$INCLUDE soa.example.com
...
$INCLUDE certbot.example.com

soa.example.com:
@ SOA ns.example.com. hostmaster.example.com. (
2017050520 ; serial
28800 ; refresh = 8h
14400 ; retry = 4h
5184000 ; expire = 60d
86400 ) ; minimum = 1d

manualisan is csinalhatod es akar DNS-en keresztul is :

https://www.sslforfree.com/

+1

sub

subs

Illetve az jutott még az eszembe, hogy a mail szerver gépre tudok httpd-t tenni, és a gateway gép valami nem standard portot át tud irányítani oda.

Ez segít? Van olyan letsencrypt ellenőrzés, ami pl. 80-as port helyett hajlandó más port számot használni?

Csak 80-on megy (esetleg 443). A windows web szerverében az acme-challenge path-t proxy-zd át a linuxra, szerintem ez a legrobusztusabb megoldás.

Megkérem azokat, akik azt a gépet faragják. Köszi az ötletet!

Ha DNS-hez hozzáférsz akkor az a legegyszerűbb szerintem. Én az acme.sh script-tet használom (pure bash), kb. így:

./acme.sh --issue --dns -d mail.domain.hu

Ez kiír egy kódot, azt fel kell venni _acme-challenge.mail.domain.hu TXT rekordba, majd

./acme.sh --renew -d mail.domain.hu

subscribe

kellhet még

- zárja be valaki a codetaget...


úgy hagytam? Szorijja