Skip to content

Commit e0eb54d

Browse files
authored
Merge pull request #131 from cgzones/cert
Add option `TLSServerCertificate=`
2 parents 4561586 + 27fcca7 commit e0eb54d

File tree

11 files changed

+44
-8
lines changed

11 files changed

+44
-8
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ systemd-netlogd reads configuration files named `/etc/systemd/netlogd.conf` and
7373
TLSCertificateAuthMode=
7474
Specifies whether to validate the certificate. Takes one of no, allow, deny, warn. Defaults to 'deny' which rejects certificates failed to validate.
7575

76+
TLSServerCertificate=
77+
Specify a custom certificate to validate the server against. Takes a path to a certificate file in PEM format.
78+
7679
KeepAlive=
7780
Takes a boolean argument. If true, the TCP/IP stack will send a keep alive message after 2h (depending on the configuration of /proc/sys/net/ipv4/tcp_keepalive_time) for all TCP streams accepted on this socket. This controls the SO_KEEPALIVE socket option (see socket(7) and the TCP Keepalive HOWTO for details.) Defaults to false.
7881

conf/netlogd.conf.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#Address=239.0.0.1:6000
33
#Protocol=udp
44
#TLSCertificateAuthMode=deny
5+
#TLSServerCertificate=
56
#LogFormat=rfc5424
67
#Directory=
78
#Namespace=

src/netlog/netlog-conf.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ int manager_parse_config_file(Manager *m) {
221221
&& m->protocol != SYSLOG_TRANSMISSION_PROTOCOL_DTLS)
222222
log_warning("TLSCertificateAuthMode= set but unencrypted %s connection specified.", protocol_to_string(m->protocol));
223223

224+
if (m->server_cert
225+
&& m->protocol != SYSLOG_TRANSMISSION_PROTOCOL_TLS
226+
&& m->protocol != SYSLOG_TRANSMISSION_PROTOCOL_DTLS)
227+
log_warning("TLSServerCertificate= set but unencrypted %s connection specified.", protocol_to_string(m->protocol));
228+
224229
if (m->dir && m->namespace)
225230
log_warning("Ignoring Namespace= setting since Directory= is set.");
226231

src/netlog/netlog-dtls.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,28 @@ void dtls_manager_free(DTLSManager *m) {
192192
free(m);
193193
}
194194

195-
int dtls_manager_init(OpenSSLCertificateAuthMode auth_mode, DTLSManager **ret) {
195+
int dtls_manager_init(OpenSSLCertificateAuthMode auth_mode, const char *server_cert, DTLSManager **ret) {
196196
_cleanup_(dtls_manager_freep) DTLSManager *m = NULL;
197197
_cleanup_(SSL_CTX_freep) SSL_CTX *ctx = NULL;
198+
int r;
198199

199200
ctx = SSL_CTX_new(DTLS_method());
200201
if (!ctx)
201202
return log_error_errno(SYNTHETIC_ERRNO(ENOMEM),
202203
"DTLS: Failed to allocate memory for SSL CTX: %m");
203204

204-
SSL_CTX_set_default_verify_paths(ctx);
205+
if (server_cert) {
206+
r = SSL_CTX_load_verify_file(ctx, server_cert);
207+
if (r != 1)
208+
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),"DTLS: Failed to load CA certificate from '%s': %s",
209+
server_cert, ERR_error_string(ERR_get_error(), NULL));
210+
} else {
211+
r = SSL_CTX_set_default_verify_paths(ctx);
212+
if (r != 1)
213+
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "DTLS: Failed to load default CA certificates: %s",
214+
ERR_error_string(ERR_get_error(), NULL));
215+
}
216+
205217
SSL_CTX_set_verify_depth(ctx, VERIFICATION_DEPTH + 1);
206218

207219
m = new(DTLSManager, 1);

src/netlog/netlog-dtls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct DTLSManager {
2222
};
2323

2424
void dtls_manager_free(DTLSManager *m);
25-
int dtls_manager_init(OpenSSLCertificateAuthMode auth_mode, DTLSManager **ret);
25+
int dtls_manager_init(OpenSSLCertificateAuthMode auth_mode, const char *server_cert, DTLSManager **ret);
2626

2727
int dtls_connect(DTLSManager *m, SocketAddress *addr);
2828
void dtls_disconnect(DTLSManager *m);

src/netlog/netlog-gperf.gperf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Network.UseSysLogStructuredData, config_parse_bool, 0, off
2525
Network.UseSysLogMsgId, config_parse_bool, 0, offsetof(Manager, syslog_msgid)
2626
Network.ConnectionRetrySec, config_parse_sec, 0, offsetof(Manager, connection_retry_usec)
2727
Network.TLSCertificateAuthMode, config_parse_tls_certificate_auth_mode, 0, offsetof(Manager, auth_mode)
28+
Network.TLSServerCertificate, config_parse_string, 0, offsetof(Manager, server_cert)
2829
Network.KeepAlive, config_parse_bool, 0, offsetof(Manager, keep_alive)
2930
Network.KeepAliveTimeSec, config_parse_sec, 0, offsetof(Manager, keep_alive_time)
3031
Network.KeepAliveIntervalSec, config_parse_sec, 0, offsetof(Manager, keep_alive_interval)

src/netlog/netlog-manager.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ void manager_free(Manager *m) {
599599

600600
free(m->dtls);
601601
free(m->tls);
602+
free(m->server_cert);
602603

603604
free(m->server_name);
604605

src/netlog/netlog-manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ struct Manager {
7373
SysLogTransmissionProtocol protocol;
7474
SysLogTransmissionLogFormat log_format;
7575
OpenSSLCertificateAuthMode auth_mode;
76+
char *server_cert;
7677

7778
bool syslog_structured_data;
7879
bool syslog_msgid;

src/netlog/netlog-tls.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,28 @@ void tls_manager_free(TLSManager *m) {
192192
free(m);
193193
}
194194

195-
int tls_manager_init(OpenSSLCertificateAuthMode auth, TLSManager **ret ) {
195+
int tls_manager_init(OpenSSLCertificateAuthMode auth, const char *server_cert, TLSManager **ret ) {
196196
_cleanup_(tls_manager_freep) TLSManager *m = NULL;
197197
_cleanup_(SSL_CTX_freep) SSL_CTX *ctx = NULL;
198+
int r;
198199

199200
ctx = SSL_CTX_new(TLS_client_method());
200201
if (!ctx)
201202
return log_error_errno(SYNTHETIC_ERRNO(ENOMEM),
202203
"TLS: Failed to allocate memory for SSL CTX: %m");
203204

204-
SSL_CTX_set_default_verify_paths(ctx);
205+
if (server_cert) {
206+
r = SSL_CTX_load_verify_file(ctx, server_cert);
207+
if (r != 1)
208+
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),"TLS: Failed to load CA certificate from '%s': %s",
209+
server_cert, ERR_error_string(ERR_get_error(), NULL));
210+
} else {
211+
r = SSL_CTX_set_default_verify_paths(ctx);
212+
if (r != 1)
213+
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "TLS: Failed to load default CA certificates: %s",
214+
ERR_error_string(ERR_get_error(), NULL));
215+
}
216+
205217
SSL_CTX_set_verify_depth(ctx, VERIFICATION_DEPTH + 1);
206218

207219
m = new(TLSManager, 1);

src/netlog/netlog-tls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct TLSManager {
2929
};
3030

3131
void tls_manager_free(TLSManager *m);
32-
int tls_manager_init(OpenSSLCertificateAuthMode auth, TLSManager **ret);
32+
int tls_manager_init(OpenSSLCertificateAuthMode auth, const char *server_cert, TLSManager **ret);
3333

3434
int tls_connect(TLSManager *m, SocketAddress *addr);
3535
void tls_disconnect(TLSManager *m);

0 commit comments

Comments
 (0)