Using SSL ========= The implementation and use of SSL has some differences on Linux and on Windows. Linux ===== SSL support for Qpid-C++, based on Mozilla's Network Security Services library, is provided as two loadable modules: one for the client (sslconnector.so), one for the broker (ssl.so). Either these libraries should be present in the relevant module directory or the 'load-module' option (or QPID_LOAD_MODULE environment variable) is used to ensure they are loaded. Broker side SSL Settings (note you can get these by qpidd --help providing the ssl.so module is loaded): SSL Settings: --ssl-use-export-policy Use NSS export policy --ssl-cert-password-file PATH File containing password to use for accessing certificate database --ssl-cert-db PATH Path to directory containing certificate database --ssl-cert-name NAME (hostname) Name of the certificate to use --ssl-port PORT (5671) Port on which to listen for SSL connections --ssl-require-client-authentication Forces clients to authenticate in order to establish an SSL connection --ssl-sasl-no-dict Disables SASL mechanisms that are vulner able to passive dictionary-based password attacks The first four of these are also available as client options (where they must either be in the client config file or set as environment variables e.g. QPID_SSL_CERT_DB). To run either the broker or client you need ssl-cert-db-path to point to the directory where relevant certificate and key databases can be found. Certificate databases are set up using certutil (included in the nss-tools package on fedora). See the NSS site for examples[1] and full details[2]. For a simple testing you can set up a single db with a single self signed certificate. E.g (with myhost and mydomain replaced by the hostname and domainname of the machine in question respectively): mkdir test_cert_db certutil -N -d test_cert_db -f cert.password certutil -S -d test_cert_db -n "myhost.mydomain" \ -s "CN=myhost.mydomain" -t "CT,," -x \ -f cert.password -z /usr/bin/certutil Here cert.password is a file with a password in it that will be needed for accessing the created db. The daemon can then be started with something like the following: ./src/qpidd --auth no --load-module src/.libs/ssl.so \ --ssl-cert-db ./test_cert_db \ --ssl-cert-password-file ./cert.password \ --ssl-cert-name myhost.mydomain then for client set: QPID_LOAD_MODULE=./src/.libs/sslconnector.so QPID_SSL_CERT_DB=./test_cert_db and run e.g. ./src/tests/perftest --count 10000 -P ssl --port 5671 \ --broker myhost.mydomain When authentication is enabled, the EXTERNAL mechanism will be available on client authenticated SSL connections. This allows the clients authorisation id to be taken from the validated client certificate (it will be the CN with any DCs present appended as the domain, e.g. CN=bob,DC=acme,DC=com would result in an identity of bob@acme.com). [1] http://www.mozilla.org/projects/security/pki/nss/ref/ssl/gtstd.html [2] http://www.mozilla.org/projects/security/pki/nss/tools/certutil.html Windows ======= SSL support for Qpid-C++ on Windows is implemented using the Microsoft Secure Channel (Schannel) package. Currently, only registry based certificates scoped to the local machine are supported, however Schannel also supports file based and user scoped certificates, so additional support could be added as required. Client certificate authentication is not supported at this time. For testing purposes, a self signed certificate can be created as follows (requiring Administrator privilege on more recent versions of Windows): makecert -ss qpidstore -n "CN=myhost.mydomain" -r -sr localmachine myhost.cer where "qpidstore" is an abitrary certificate store name. The resulting output file "myhost.cer" is the public key of the certificate that will be required by any client that wishes to authenticate myhost. To run the server (also as Administrator on recent Windows versions): qpidd --ssl-cert-name myhost.mydomain --ssl-cert-store qpidstore [other-args] On the Windows client side, the SSL support is available without loading a separate support module. For each machine or separate user that will be using qpid, you must import the self signed certificate as a trusted root. This can be done from the MMC certificate snapin or directly using certmgr.exe. From the main window: select "Third-Party Root Certification Authorities" select "Action" -> "Import..." then direct the Certificate Import Wizard to the "myhost.cer" file To test the setup: perftest --count 10000 -P ssl --port 5671 --broker myhost.mydomain To export the certificate to non Windows clients, note that "myhost.cer" is the X.509 representation of the public key of the certificate in DER format. Import the certificate into the other clients if they support the DER format. Otherwise the certificate can be converted to PEM format using OpenSSL openssl x509 -in myhost.cer -inform DER -out myhost.pem -outform PEM