Fix certificate chain loading

This commit is contained in:
Simon Stürz 2018-08-16 18:15:14 +02:00
parent d4d34a86c2
commit f0599d59eb
13 changed files with 59 additions and 11 deletions

1
.gitignore vendored
View File

@ -73,6 +73,7 @@ Thumbs.db
coverage-html coverage-html
client/nymea-remoteproxy-client client/nymea-remoteproxy-client
monitor/nymea-remoteproxy-monitor
tests/test-offline/nymea-remoteproxy-tests-offline tests/test-offline/nymea-remoteproxy-tests-offline
tests/test-online/nymea-remoteproxy-tests-online tests/test-online/nymea-remoteproxy-tests-online
.crossbuilder/ .crossbuilder/

View File

@ -6,7 +6,7 @@ Wants=network-online.target
[Service] [Service]
Type=simple Type=simple
ExecStart=/usr/bin/nymea-remoteproxy -c /etc/nymea/nymea-remoteproxy.conf ExecStart=/usr/bin/nymea-remoteproxy -c /etc/nymea/nymea-remoteproxy.conf --verbose
StandardOutput=journal StandardOutput=journal
StandardError=journal StandardError=journal
Restart=on-failure Restart=on-failure

View File

@ -123,6 +123,11 @@ WebSocketServer *Engine::webSocketServer() const
return m_webSocketServer; return m_webSocketServer;
} }
MonitorServer *Engine::monitorServer() const
{
return m_monitorServer;
}
Engine::Engine(QObject *parent) : Engine::Engine(QObject *parent) :
QObject(parent) QObject(parent)
{ {
@ -137,7 +142,7 @@ Engine::~Engine()
void Engine::clean() void Engine::clean()
{ {
if (m_monitorServer) { if (m_monitorServer) {
m_monitorServer->startServer(); m_monitorServer->stopServer();
delete m_monitorServer; delete m_monitorServer;
m_monitorServer = nullptr; m_monitorServer = nullptr;
} }

View File

@ -37,6 +37,7 @@ public:
Authenticator *authenticator() const; Authenticator *authenticator() const;
ProxyServer *proxyServer() const; ProxyServer *proxyServer() const;
WebSocketServer *webSocketServer() const; WebSocketServer *webSocketServer() const;
MonitorServer *monitorServer() const;
private: private:
explicit Engine(QObject *parent = nullptr); explicit Engine(QObject *parent = nullptr);

View File

@ -15,6 +15,19 @@ MonitorServer::MonitorServer(const QString &serverName, QObject *parent) :
connect(m_timer, &QTimer::timeout, this, &MonitorServer::onTimeout); connect(m_timer, &QTimer::timeout, this, &MonitorServer::onTimeout);
} }
MonitorServer::~MonitorServer()
{
stopServer();
}
bool MonitorServer::running() const
{
if (!m_server)
return false;
return m_server->isListening();
}
QVariantMap MonitorServer::createMonitorData() QVariantMap MonitorServer::createMonitorData()
{ {
QVariantMap monitorData; QVariantMap monitorData;
@ -66,9 +79,10 @@ void MonitorServer::onMonitorDisconnected()
void MonitorServer::startServer() void MonitorServer::startServer()
{ {
qCDebug(dcMonitorServer()) << "Starting server on" << m_serverName;
m_server = new QLocalServer(this); m_server = new QLocalServer(this);
if (!m_server->listen(m_serverName)) { if (!m_server->listen(m_serverName)) {
qCWarning(dcMonitorServer()) << "Could not start local server for monitor on" << m_serverName; qCWarning(dcMonitorServer()) << "Could not start local server for monitor on" << m_serverName << m_server->errorString();
delete m_server; delete m_server;
m_server = nullptr; m_server = nullptr;
return; return;

View File

@ -13,6 +13,9 @@ class MonitorServer : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit MonitorServer(const QString &serverName, QObject *parent = nullptr); explicit MonitorServer(const QString &serverName, QObject *parent = nullptr);
~MonitorServer();
bool running() const;
private: private:
QString m_serverName; QString m_serverName;

View File

@ -32,6 +32,7 @@ bool ProxyConfiguration::loadConfiguration(const QString &fileName)
setServerName(settings.value("name", "nymea-remoteproxy").toString()); setServerName(settings.value("name", "nymea-remoteproxy").toString());
setWriteLogFile(settings.value("writeLogs", false).toBool()); setWriteLogFile(settings.value("writeLogs", false).toBool());
setLogFileName(settings.value("logFile", "/var/log/nymea-remoteproxy.log").toString()); setLogFileName(settings.value("logFile", "/var/log/nymea-remoteproxy.log").toString());
setMonitorSocketFileName(settings.value("monitorSocket", "/tmp/nymea-remoteproxy.monitor").toString());
setSslCertificateFileName(settings.value("certificate", "/etc/ssl/certs/ssl-cert-snakeoil.pem").toString()); setSslCertificateFileName(settings.value("certificate", "/etc/ssl/certs/ssl-cert-snakeoil.pem").toString());
setSslCertificateKeyFileName(settings.value("certificateKey", "/etc/ssl/private/ssl-cert-snakeoil.key").toString()); setSslCertificateKeyFileName(settings.value("certificateKey", "/etc/ssl/private/ssl-cert-snakeoil.key").toString());
setSslCertificateChainFileName(settings.value("certificateChain", "").toString()); setSslCertificateChainFileName(settings.value("certificateChain", "").toString());
@ -80,8 +81,10 @@ bool ProxyConfiguration::loadConfiguration(const QString &fileName)
qCWarning(dcApplication()) << "Could not open certificate chain file:" << sslCertificateChainFileName() << certChainFile.errorString(); qCWarning(dcApplication()) << "Could not open certificate chain file:" << sslCertificateChainFileName() << certChainFile.errorString();
return false; return false;
} }
QSslCertificate certificate(&certKeyFile, QSsl::Pem); QSslCertificate certificate(&certChainFile, QSsl::Pem);
sslConfiguration.setLocalCertificateChain( { certificate } ); sslConfiguration.setCaCertificates( QList<QSslCertificate>() << certificate );
certChainFile.close();
qCDebug(dcApplication()) << "Loaded successfully certificate chain" << sslCertificateKeyFileName();
} }
m_sslConfiguration = sslConfiguration; m_sslConfiguration = sslConfiguration;
@ -119,6 +122,16 @@ void ProxyConfiguration::setLogFileName(const QString &logFileName)
m_logFileName = logFileName; m_logFileName = logFileName;
} }
QString ProxyConfiguration::monitorSocketFileName() const
{
return m_monitorSocketFileName;
}
void ProxyConfiguration::setMonitorSocketFileName(const QString &fileName)
{
m_monitorSocketFileName = fileName;
}
QString ProxyConfiguration::sslCertificateFileName() const QString ProxyConfiguration::sslCertificateFileName() const
{ {
return m_sslCertificateFileName; return m_sslCertificateFileName;

View File

@ -26,6 +26,9 @@ public:
QString logFileName() const; QString logFileName() const;
void setLogFileName(const QString &logFileName); void setLogFileName(const QString &logFileName);
QString monitorSocketFileName() const;
void setMonitorSocketFileName(const QString &fileName);
QString sslCertificateFileName() const; QString sslCertificateFileName() const;
void setSslCertificateFileName(const QString &fileName); void setSslCertificateFileName(const QString &fileName);
@ -56,6 +59,7 @@ private:
QString m_serverName; QString m_serverName;
bool m_writeLogFile = false; bool m_writeLogFile = false;
QString m_logFileName = "/var/log/nymea-remoteproxy.log"; QString m_logFileName = "/var/log/nymea-remoteproxy.log";
QString m_monitorSocketFileName;
QString m_sslCertificateFileName = "/etc/ssl/certs/ssl-cert-snakeoil.pem"; QString m_sslCertificateFileName = "/etc/ssl/certs/ssl-cert-snakeoil.pem";
QString m_sslCertificateKeyFileName = "/etc/ssl/private/ssl-cert-snakeoil.key"; QString m_sslCertificateKeyFileName = "/etc/ssl/private/ssl-cert-snakeoil.key";
QString m_sslCertificateChainFileName; QString m_sslCertificateChainFileName;

View File

@ -241,6 +241,7 @@ void ProxyServer::startServer()
foreach (TransportInterface *interface, m_transportInterfaces) { foreach (TransportInterface *interface, m_transportInterfaces) {
interface->startServer(); interface->startServer();
} }
setRunning(true);
} }
void ProxyServer::stopServer() void ProxyServer::stopServer()
@ -249,6 +250,7 @@ void ProxyServer::stopServer()
foreach (TransportInterface *interface, m_transportInterfaces) { foreach (TransportInterface *interface, m_transportInterfaces) {
interface->stopServer(); interface->stopServer();
} }
setRunning(false);
} }
} }

View File

@ -1,6 +1,7 @@
name=nymea-remoteproxy name=nymea-remoteproxy
writeLogs=false writeLogs=false
logFile=/var/log/nymea-remoteproxy.log logFile=/var/log/nymea-remoteproxy.log
monitorSocket=/tmp/nymea-remoteproxy.monitor
certificate=/etc/ssl/certs/ssl-cert-snakeoil.pem certificate=/etc/ssl/certs/ssl-cert-snakeoil.pem
certificateKey=/etc/ssl/private/ssl-cert-snakeoil.key certificateKey=/etc/ssl/private/ssl-cert-snakeoil.key
certificateChain= certificateChain=

View File

@ -34,11 +34,10 @@ void RemoteProxyOfflineTests::dummyAuthenticator()
QVERIFY(runningSpy.count() == 1); QVERIFY(runningSpy.count() == 1);
// Make sure the server is not running // Make sure the server is running
QVERIFY(Engine::instance()->running()); QVERIFY(Engine::instance()->running());
// Make sure the websocket server is not running
QVERIFY(Engine::instance()->webSocketServer()->running()); QVERIFY(Engine::instance()->webSocketServer()->running());
QVERIFY(Engine::instance()->proxyServer()->running());
// Create request // Create request
QVariantMap params; QVariantMap params;
@ -53,6 +52,13 @@ void RemoteProxyOfflineTests::dummyAuthenticator()
cleanUpEngine(); cleanUpEngine();
} }
void RemoteProxyOfflineTests::monitorServer()
{
startServer();
QVERIFY(Engine::instance()->monitorServer()->running());
}
void RemoteProxyOfflineTests::webserverConnectionBlocked() void RemoteProxyOfflineTests::webserverConnectionBlocked()
{ {
// Create a dummy server which blocks the port // Create a dummy server which blocks the port

View File

@ -25,6 +25,7 @@ private slots:
// Basic stuff // Basic stuff
void startStopServer(); void startStopServer();
void dummyAuthenticator(); void dummyAuthenticator();
void monitorServer();
// WebSocket connection // WebSocket connection
void webserverConnectionBlocked(); void webserverConnectionBlocked();

View File

@ -85,13 +85,10 @@ public slots:
.toLatin1().data()); .toLatin1().data());
} }
inline void verifyAuthenticationError(const QVariant &response, Authenticator::AuthenticationError error = Authenticator::AuthenticationErrorNoError) { inline void verifyAuthenticationError(const QVariant &response, Authenticator::AuthenticationError error = Authenticator::AuthenticationErrorNoError) {
verifyError(response, "authenticationError", JsonTypes::authenticationErrorToString(error)); verifyError(response, "authenticationError", JsonTypes::authenticationErrorToString(error));
} }
}; };
#endif // BASETEST_H #endif // BASETEST_H