About Certificates
Abhängig von OS und Technologie können Zertifikate verschieden verwendet werden. Folgend wird auf die verschiedene Zertifikate Stores eingeangen: Windows, Unix und JKS (für Win und Unix).
Ausgangslage
- Für SAP HANA Connections sollen intern signierte Zertifikate verwendet werden.
- Es gibt eine interne CA, die Certs austellt.
- Die Datenbank Verbindung kann grundsätzlich via JDBC oder hdbcli erfolgen.
- jdbc: Jetbrains Database Extension (Datagrip oder integriert in PyCharm) sowie DBeaver verwenden jdbc. SAP HANA - JDBC Connection Properties
- hdbcli: Python verwendet entweder direkt das native
hdbcliPackage oder dann dasselbe via sqlalchemy (sqlalchemy-hana). SAP HANA - Connect Method and Python Connection Properties (hdbcli)
- Der Zugriff kann von Windows oder Unix erfolgen.
Cert Stores
Root-Zertifikate können entweder direkt als File (crt/pem) verwendet werden oder via einen Cert Store, der die Zertifikate geschützt zur Verfügung stellt:
- Windows bietet dazu die Programme “Manage computer / user certifcates” (direkt via Start Menu) an. Resp. kann via MMC verwendet werden.
- Linux hat das Package
ca-certificatesmit dem Befehlupdate-ca-certificatesapt install -y ca-certificates cp local-ca.crt /usr/local/share/ca-certificates update-ca-certificates - Java hat ein eigenes Dateiformat
jks(java keystore), das mit dem Programmkeytoolverwaltet werden kann.- In Windows kann Java direkt den Windows Cert Store verwenden, dazu muss die VM Option:
-Djavax.net.ssl.trustStoreType=Windows-ROOTangegeben werden. Ansonsten muss der Pfad zu einemjksangegeben sein. - In Linux wird mit
ca-certificates-javaautomatisch beim Ausführen vonupdate-ca-certificateseinjksmit allen system-weiten Root-Zertifikate erstellt. Dieses liegt hier:/etc/ssl/certs/java/cacerts - der JKS ist immer mit einem Passwort geschützt, standardmässig mit:
changeit
- In Windows kann Java direkt den Windows Cert Store verwenden, dazu muss die VM Option:
DB Clients
- SAP HANA Client Interface Programming Reference
- Windows
hdbcli: verwendet standardmässig automatisch den Windows Storejdbc: falls-Djavax.net.ssl.trustStoreType=Windows-ROOTebenfalls den Windows Store- DBeaver: verwendet standardmässig den Windows Store
- PyCharm: verwendet grundsätzlich auch den Windows Store, allerdings läuft jede Database Connection in einer eigenen JAVA VM, dort wird der Windows Store nicht verwerwendet.

- Linux
hdbcli: demdbapi.connect()muss das ArgumentsslTrustStore = '/etc/ssl/certs/ca-certificates.crt'mitgegeben werden.sqlalchemy: Connection String muss wie folgt erweiter werden&sslTrustStore=/etc/ssl/certs/ca-certificates.crt- Platformunabhängiger Code kann beispielsweise so aussehen:
from sys import platform if platform.startswith("linux"): # for hdbcli sslTrustStore = '/etc/ssl/certs/ca-certificates.crt' # for sqlalchemy conn_str_hana = 'hana://DB_USER:DB_PASSWORD@DB_ADDRESS:/?encrypt=true&sslTrustStore=/etc/ssl/certs/ca-certificates.crt' end
jdbc:DBeaver: verwende ich nicht auf Linux.- PyCharm: trust Store von Linux muss angegeben werden: trustStore
/etc/ssl/certs/java/cacerts
SAP HANA und Zertifikate
HANA hat standardmässig selbstsignierte Zertifikate. Das aktuelle public Zertifikat einer HANA DB kann wie folgt abgerufen werden:
</dev/null openssl s_client -connect db.sap.hana.com:12345 | openssl x509 > db.sap.hana.com:12345.pem
# to display the cert
openssl x509 -in db.sap.hana.com:12345.pem -text -noout
# or display the fingerprint
openssl x509 -in db.sap.hana.com:12345.pem -fingerprint -sha256
Soll das self-signed Cert in einen jks importiert werden:
# contains also keytool
sudo apt install default-jdk-headless
keytool -importcert -alias 'db.sap.hana.com:12345' -file "db.sap.hana.com.pem" -keystore my_certs.jks
# display all keys inside a jks
keytool -list -keystore my_certs.jks -v -storepass changeit
Insofern das Cert vorliegt, muss bei der Connection nur die Option encrypt=True gesetzt werden und der Zugriff erfolgt verschlüsselt via verifizierten Host.
Andere Certs
# download SMTP certs from server
openssl s_client -starttls smtp -connect xxx.com:25 -showcerts </dev/null > chain.pem