-
Notifications
You must be signed in to change notification settings - Fork 40
Add core SSL trust store resolution and fallback logic (PR 2 of 3) #786
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
madhav-db
merged 25 commits into
databricks:main
from
databricks:ssl-truststore-handling-2
Apr 25, 2025
Merged
Changes from all commits
Commits
Show all changes
25 commits
Select commit
Hold shift + click to select a range
a792846
core SSL functionality
madhav-db 85eebec
fix error order
madhav-db 7a90adf
address comments and adds more comprehensive tests
madhav-db 151ba50
adds specific exceptions
madhav-db 4f6672d
streamline exception handling
madhav-db a5d32a1
fmt
madhav-db cdb13bb
Merge branch 'main' into ssl-truststore-handling-2
madhav-db 400f7be
break down tasks
madhav-db f36879f
modify test
madhav-db fbf56b2
modify test
madhav-db 55e7660
modify yaml
madhav-db 646a3df
modify yaml
madhav-db 638f41b
modify yaml
madhav-db 5a791aa
modify yaml
madhav-db 1919005
modify yaml
madhav-db f919802
modify yaml
madhav-db 2042083
address comments
madhav-db 36e0be2
address comments
madhav-db 368d019
address comments
madhav-db 798ee39
Merge branch 'main' into ssl-truststore-handling-2
madhav-db 2fcf119
address comments
madhav-db 7eff8d3
fmt
madhav-db 5e17ee5
fmt
madhav-db 3dd349c
comment
madhav-db 26bf7bd
undo comment
madhav-db File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,221 @@ | ||
| # =================================================================== | ||
| # GitHub Action: SSL Certificate Validation Test with Squid Proxy | ||
| # | ||
| # Purpose: | ||
| # This workflow simulates real-world SSL trust chain configurations | ||
| # to validate JDBC driver support for: | ||
| # - Custom trust stores | ||
| # - System trust stores | ||
| # - Self-signed certificate handling | ||
| # - Revocation and fallback behavior | ||
| # | ||
| # How: | ||
| # - Generates a Root CA, Intermediate CA, and signs a server cert (mirroring real world use-cases) | ||
| # - Starts a Squid HTTPS proxy using the signed cert | ||
| # - Creates a Java truststore with the correct anchors | ||
| # - Optionally installs the Root CA into system trust store | ||
| # - Runs targeted JDBC integration tests using SSLTest.java | ||
| # ===================================================================1 | ||
|
|
||
| name: SSL Certificate Validation Test with Squid Proxy | ||
|
|
||
| on: | ||
| workflow_dispatch: | ||
| pull_request: | ||
|
|
||
| jobs: | ||
| ssl-test: | ||
| runs-on: | ||
| group: databricks-protected-runner-group | ||
| labels: linux-ubuntu-latest | ||
|
|
||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set Up Java | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| java-version: "21" | ||
| distribution: "adopt" | ||
|
|
||
| - name: Install Squid and SSL Tools | ||
| run: | | ||
| sudo apt-get update | ||
| sudo apt-get install -y squid openssl libnss3-tools ca-certificates | ||
|
|
||
| - name: Create Root CA and Certificates | ||
| run: | | ||
| mkdir -p /tmp/ssl-certs | ||
| cd /tmp/ssl-certs | ||
|
|
||
| # Generate Root CA | ||
| openssl genrsa -out rootCA.key 4096 | ||
| openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 365 -out rootCA.crt \ | ||
| -subj "/C=US/ST=California/L=San Francisco/O=Databricks Test/OU=Testing/CN=Databricks Test Root CA" | ||
|
|
||
| # Generate Intermediate CA | ||
| openssl genrsa -out intermediateCA.key 4096 | ||
| openssl req -new -key intermediateCA.key -out intermediateCA.csr \ | ||
| -subj "/C=US/ST=California/L=San Francisco/O=Databricks Test/OU=Testing/CN=Databricks Test Intermediate CA" | ||
|
|
||
| # Create extension file for intermediate CA | ||
| cat > intermediate_ext.cnf << EOF | ||
| [ v3_ca ] | ||
| subjectKeyIdentifier = hash | ||
| authorityKeyIdentifier = keyid:always,issuer | ||
| basicConstraints = critical, CA:true, pathlen:0 | ||
| keyUsage = critical, digitalSignature, cRLSign, keyCertSign | ||
| EOF | ||
|
|
||
| # Sign Intermediate CA with Root CA | ||
| openssl x509 -req -in intermediateCA.csr -CA rootCA.crt -CAkey rootCA.key \ | ||
| -CAcreateserial -out intermediateCA.crt -days 365 -sha256 \ | ||
| -extfile intermediate_ext.cnf -extensions v3_ca | ||
|
|
||
| # Generate Squid Proxy Certificate | ||
| openssl genrsa -out squid.key 2048 | ||
| openssl req -new -key squid.key -out squid.csr \ | ||
| -subj "/C=US/ST=California/L=San Francisco/O=Databricks Test/OU=Testing/CN=localhost" | ||
|
|
||
| # Create extension file for Squid certificate | ||
| cat > squid_ext.cnf << EOF | ||
| [ v3_req ] | ||
| basicConstraints = CA:FALSE | ||
| keyUsage = digitalSignature, keyEncipherment | ||
| extendedKeyUsage = serverAuth | ||
| subjectAltName = @alt_names | ||
|
|
||
| [alt_names] | ||
| DNS.1 = localhost | ||
| IP.1 = 127.0.0.1 | ||
| EOF | ||
|
|
||
| # Sign Squid certificate with Intermediate CA | ||
| openssl x509 -req -in squid.csr -CA intermediateCA.crt -CAkey intermediateCA.key \ | ||
| -CAcreateserial -out squid.crt -days 365 -sha256 \ | ||
| -extfile squid_ext.cnf -extensions v3_req | ||
|
|
||
| # Create PEM file for Squid | ||
| cat squid.crt squid.key > squid.pem | ||
| chmod 400 squid.pem | ||
|
|
||
| # Copy to appropriate locations | ||
| sudo cp squid.pem /etc/squid/ | ||
| sudo chown proxy:proxy /etc/squid/squid.pem | ||
|
|
||
| # Create Java Keystore from Root CA - with proper trust anchors | ||
| rm -f test-truststore.jks | ||
|
|
||
| # Create a truststore with the root CA as a trusted certificate entry | ||
| keytool -importcert -noprompt -trustcacerts -alias rootca -file rootCA.crt \ | ||
| -keystore test-truststore.jks -storepass changeit | ||
|
|
||
| # Also add the intermediate CA to the trust store | ||
| keytool -importcert -noprompt -trustcacerts -alias intermediateca -file intermediateCA.crt \ | ||
| -keystore test-truststore.jks -storepass changeit | ||
|
|
||
| chmod 644 test-truststore.jks | ||
|
|
||
| - name: Configure Squid with Standard SSL | ||
| run: | | ||
| sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.orig | ||
|
|
||
| echo " | ||
| # Basic Configuration | ||
| http_port 3128 | ||
|
|
||
| # Plain HTTPS port with certificate | ||
| https_port 3129 tls-cert=/etc/squid/squid.pem | ||
|
|
||
| # Access Control - very permissive for testing | ||
| http_access allow all | ||
| always_direct allow all | ||
|
|
||
| # Avoid DNS issues in test environment | ||
| dns_v4_first on | ||
|
|
||
| # Disable caching for testing | ||
| cache deny all | ||
|
|
||
| # Logging | ||
| debug_options ALL,1 | ||
| logfile_rotate 0 | ||
| cache_log /var/log/squid/cache.log | ||
| access_log /var/log/squid/access.log squid | ||
| " | sudo tee /etc/squid/squid.conf | ||
|
|
||
| sudo mkdir -p /var/log/squid | ||
| sudo chown -R proxy:proxy /var/log/squid | ||
| sudo chmod 755 /var/log/squid | ||
|
|
||
| sudo squid -k parse || echo "Configuration has issues but we'll try to run it anyway" | ||
|
|
||
| - name: Start Squid Proxy | ||
| run: | | ||
| sudo systemctl stop squid || true | ||
| sudo pkill squid || true | ||
|
|
||
| sudo squid -N -d 3 -f /etc/squid/squid.conf & | ||
|
|
||
| sleep 5 | ||
| ps aux | grep squid | ||
|
|
||
| - name: Wait for Squid to be Ready | ||
| run: | | ||
| for i in {1..5}; do | ||
| if curl -v -x http://localhost:3128 http://databricks.com -m 10 -o /dev/null; then | ||
| echo "HTTP proxy on 3128 is working!" | ||
| break | ||
| fi | ||
|
|
||
| sleep 3 | ||
| done | ||
|
|
||
| if ps aux | grep -v grep | grep squid > /dev/null; then | ||
| echo "Squid is running" | ||
| else | ||
| echo "Squid is not running! Attempting restart..." | ||
| sudo squid -N -d 3 -f /etc/squid/squid.conf & | ||
| sleep 5 | ||
| fi | ||
|
|
||
| - name: Install Root CA in System Trust Store | ||
| run: | | ||
| sudo cp /tmp/ssl-certs/rootCA.crt /usr/local/share/ca-certificates/databricks-test-rootca.crt | ||
| sudo update-ca-certificates | ||
|
|
||
| - name: Maven Build | ||
| run: | | ||
| mvn clean package -DskipTests | ||
|
|
||
| - name: Set Environment Variables | ||
| env: | ||
| DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }} | ||
| DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }} | ||
| DATABRICKS_HTTP_PATH: ${{ secrets.DATABRICKS_HTTP_PATH }} | ||
| HTTP_PROXY_URL: "http://localhost:3128" | ||
| HTTPS_PROXY_URL: "https://localhost:3129" | ||
| TRUSTSTORE_PATH: "/tmp/ssl-certs/test-truststore.jks" | ||
| TRUSTSTORE_PASSWORD: "changeit" | ||
| run: | | ||
| echo "DATABRICKS_TOKEN=${DATABRICKS_TOKEN}" >> $GITHUB_ENV | ||
| echo "DATABRICKS_HOST=${DATABRICKS_HOST}" >> $GITHUB_ENV | ||
| echo "DATABRICKS_HTTP_PATH=${DATABRICKS_HTTP_PATH}" >> $GITHUB_ENV | ||
| echo "HTTP_PROXY_URL=${HTTP_PROXY_URL}" >> $GITHUB_ENV | ||
| echo "HTTPS_PROXY_URL=${HTTPS_PROXY_URL}" >> $GITHUB_ENV | ||
| echo "TRUSTSTORE_PATH=${TRUSTSTORE_PATH}" >> $GITHUB_ENV | ||
| echo "TRUSTSTORE_PASSWORD=${TRUSTSTORE_PASSWORD}" >> $GITHUB_ENV | ||
|
|
||
| - name: Run SSL Tests | ||
| run: | | ||
| mvn test -Dtest=**/SSLTest.java | ||
|
|
||
| - name: Cleanup | ||
| if: always() | ||
| run: | | ||
| sudo systemctl stop squid | ||
| sudo systemctl disable squid | ||
| sudo pkill squid | ||
| sudo rm -f /usr/local/share/ca-certificates/databricks-test-rootca.crt | ||
| sudo update-ca-certificates --fresh |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.