From b0d7948b64ec88df6836b3b498268fd826dca625 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Wed, 25 Nov 2020 13:53:51 -0600 Subject: [PATCH] Add x509 --- .../authentication/x509/build.gradle | 35 ++++ .../authentication/x509/gradle.properties | 1 + .../authentication/x509/gradle/gretty.gradle | 41 ++++ .../x509/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../authentication/x509/gradlew | 185 ++++++++++++++++++ .../authentication/x509/gradlew.bat | 104 ++++++++++ .../authentication/x509/server/ca.pem | 22 +++ .../authentication/x509/server/dianne.p12 | Bin 0 -> 1768 bytes .../authentication/x509/server/rod.p12 | Bin 0 -> 1784 bytes .../authentication/x509/server/scott.p12 | Bin 0 -> 1768 bytes .../authentication/x509/server/server.jks | Bin 0 -> 84658 bytes .../authentication/x509/server/tomcat.xml | 34 ++++ .../authentication/x509/settings.gradle | 1 + .../src/integTest/java/example/X509Tests.java | 84 ++++++++ .../example/ApplicationConfiguration.java | 26 +++ .../src/main/java/example/MeController.java | 38 ++++ .../example/MvcWebApplicationInitializer.java | 46 +++++ .../java/example/SecurityConfiguration.java | 71 +++++++ .../SecurityWebApplicationInitializer.java | 35 ++++ .../java/example/WebMvcConfiguration.java | 26 +++ .../x509/src/main/resources/certs/client.cer | 21 ++ .../src/main/resources/certs/client.keystore | 0 .../x509/src/main/resources/certs/client.pem | 32 +++ .../x509/src/main/resources/certs/curl_app.sh | 2 + .../x509/src/main/resources/certs/server.p12 | Bin 0 -> 9319 bytes .../src/main/resources/certs/tomcat.keystore | 0 .../x509/src/main/resources/logback.xml | 12 ++ .../src/main/resources/templates/index.html | 29 +++ settings.gradle | 1 + 30 files changed, 851 insertions(+) create mode 100644 servlet/java-configuration/authentication/x509/build.gradle create mode 100644 servlet/java-configuration/authentication/x509/gradle.properties create mode 100644 servlet/java-configuration/authentication/x509/gradle/gretty.gradle create mode 100644 servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.jar create mode 100644 servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.properties create mode 100755 servlet/java-configuration/authentication/x509/gradlew create mode 100644 servlet/java-configuration/authentication/x509/gradlew.bat create mode 100644 servlet/java-configuration/authentication/x509/server/ca.pem create mode 100644 servlet/java-configuration/authentication/x509/server/dianne.p12 create mode 100644 servlet/java-configuration/authentication/x509/server/rod.p12 create mode 100644 servlet/java-configuration/authentication/x509/server/scott.p12 create mode 100644 servlet/java-configuration/authentication/x509/server/server.jks create mode 100644 servlet/java-configuration/authentication/x509/server/tomcat.xml create mode 100644 servlet/java-configuration/authentication/x509/settings.gradle create mode 100644 servlet/java-configuration/authentication/x509/src/integTest/java/example/X509Tests.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/ApplicationConfiguration.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/MeController.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/MvcWebApplicationInitializer.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/SecurityConfiguration.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/SecurityWebApplicationInitializer.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/java/example/WebMvcConfiguration.java create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/client.cer create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/client.keystore create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/client.pem create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/curl_app.sh create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/server.p12 create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/certs/tomcat.keystore create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/logback.xml create mode 100644 servlet/java-configuration/authentication/x509/src/main/resources/templates/index.html diff --git a/servlet/java-configuration/authentication/x509/build.gradle b/servlet/java-configuration/authentication/x509/build.gradle new file mode 100644 index 0000000..fff1dc6 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/build.gradle @@ -0,0 +1,35 @@ +plugins { + id "java" + id "nebula.integtest" version "7.0.9" + id "org.gretty" version "3.0.3" + id "war" +} + +apply from: "gradle/gretty.gradle" + +repositories { + jcenter() + maven { url "https://repo.spring.io/snapshot" } +} + +dependencies { + implementation platform("org.springframework:spring-framework-bom:5.3.0") + implementation platform("org.springframework.security:spring-security-bom:5.5.0-SNAPSHOT") + implementation platform("org.junit:junit-bom:5.7.0") + + implementation "org.springframework.security:spring-security-config" + implementation "org.springframework.security:spring-security-web" + implementation "org.springframework:spring-webmvc" + implementation "org.apache.httpcomponents:httpclient:4.5.13" + + testImplementation "org.assertj:assertj-core:3.18.0" + testImplementation "org.springframework:spring-test" + testImplementation "org.springframework.security:spring-security-test" + testImplementation("org.junit.jupiter:junit-jupiter-api") + + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") +} + +tasks.withType(Test).configureEach { + useJUnitPlatform() +} diff --git a/servlet/java-configuration/authentication/x509/gradle.properties b/servlet/java-configuration/authentication/x509/gradle.properties new file mode 100644 index 0000000..fe89f6a --- /dev/null +++ b/servlet/java-configuration/authentication/x509/gradle.properties @@ -0,0 +1 @@ +tomcat85Version=8.5.54 diff --git a/servlet/java-configuration/authentication/x509/gradle/gretty.gradle b/servlet/java-configuration/authentication/x509/gradle/gretty.gradle new file mode 100644 index 0000000..3df1479 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/gradle/gretty.gradle @@ -0,0 +1,41 @@ +gretty { + servletContainer = "tomcat85" + contextPath = "/" + fileLogEnabled = false + integrationTestTask = 'integrationTest' +} + +Task prepareAppServerForIntegrationTests = project.tasks.create('prepareAppServerForIntegrationTests') { + group = 'Verification' + description = 'Prepares the app server for integration tests' + doFirst { + project.gretty { + httpPort = -1 + } + } +} + +project.tasks.matching { it.name == "appBeforeIntegrationTest" }.all { task -> + task.dependsOn prepareAppServerForIntegrationTests +} + +project.tasks.matching { it.name == "integrationTest" }.all { + task -> task.doFirst { + def gretty = project.gretty + String host = project.gretty.host ?: 'localhost' + boolean isHttps = gretty.httpsEnabled + Integer httpPort = integrationTest.systemProperties['gretty.httpPort'] + Integer httpsPort = integrationTest.systemProperties['gretty.httpsPort'] + int port = isHttps ? httpsPort : httpPort + String contextPath = project.gretty.contextPath + String httpBaseUrl = "http://${host}:${httpPort}${contextPath}" + String httpsBaseUrl = "https://${host}:${httpsPort}${contextPath}" + String baseUrl = isHttps ? httpsBaseUrl : httpBaseUrl + integrationTest.systemProperty 'app.port', port + integrationTest.systemProperty 'app.httpPort', httpPort + integrationTest.systemProperty 'app.httpsPort', httpsPort + integrationTest.systemProperty 'app.baseURI', baseUrl + integrationTest.systemProperty 'app.httpBaseURI', httpBaseUrl + integrationTest.systemProperty 'app.httpsBaseURI', httpsBaseUrl + } +} \ No newline at end of file diff --git a/servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.jar b/servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 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 literal 0 HcmV?d00001 diff --git a/servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.properties b/servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..be52383 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/servlet/java-configuration/authentication/x509/gradlew b/servlet/java-configuration/authentication/x509/gradlew new file mode 100755 index 0000000..fbd7c51 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/servlet/java-configuration/authentication/x509/gradlew.bat b/servlet/java-configuration/authentication/x509/gradlew.bat new file mode 100644 index 0000000..a9f778a --- /dev/null +++ b/servlet/java-configuration/authentication/x509/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/servlet/java-configuration/authentication/x509/server/ca.pem b/servlet/java-configuration/authentication/x509/server/ca.pem new file mode 100644 index 0000000..a5b52ca --- /dev/null +++ b/servlet/java-configuration/authentication/x509/server/ca.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIEMKX1dzANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMC +R0IxETAPBgNVBAgTCFNjb3RsYW5kMRAwDgYDVQQHEwdHbGFzZ293MRkwFwYDVQQK +ExBTcHJpbmcgRnJhbWV3b3JrMRgwFgYDVQQLEw9TcHJpbmcgU2VjdXJpdHkxIDAe +BgNVBAMTF1NwcmluZyBTZWN1cml0eSBUZXN0IENBMB4XDTA4MDEyNTExMTIyMVoX +DTE4MDIyNTAwMDAwMFowgYkxCzAJBgNVBAYTAkdCMREwDwYDVQQIEwhTY290bGFu +ZDEQMA4GA1UEBxMHR2xhc2dvdzEZMBcGA1UEChMQU3ByaW5nIEZyYW1ld29yazEY +MBYGA1UECxMPU3ByaW5nIFNlY3VyaXR5MSAwHgYDVQQDExdTcHJpbmcgU2VjdXJp +dHkgVGVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALzl/wEe +snYrwqaGZuB8hmwACtptazh1+eXCfd66FkioxlLF7yTnjCC7DT+vmMgSuThIEIsN +xlxLpEgyU3bU8GIuR8wyYIyvuSMcptdFJLV7NKYuRycxpDuqimTM7Br0nfNgKVEv +1QwguGWr6YN3aZ68/xe/D5xyPhakKu++7VFXIXw9f0+nqojdrFTqQ6l9GAVRgfX6 +h4JOaV1VFx83y2pnFj0iFneVxRcvXyWnyXlcOvJDIyVuyS/hYxb+E5rtBvp5XQ0o +5CP4OMwCZGx/jEqlL8oO7BwEgu9aEBxKvoIKJmHDTHgWIxgawTrKabmong4utnMI +yNrhsI77bmh2U7UCAwEAAaMQMA4wDAYDVR0PBAUDAwcGADANBgkqhkiG9w0BAQUF +AAOCAQEAuD8W9Ukkfyi0y65mwguFVAqBC3RSTMRXcjbLQV4rMDM/Q9kjA6acY4Ta +WgxGTwNCydqaqwDVsmn+6Je8Lp2xm9KLDLypVdNopGs+Mlfo55dhwqymXkQw1oJI +CPhR3nBmGEnSWW0UY9bPlpxRF2D5GDVwpuxDtXvWa4baPwRRI9MxwPWHA3ITl+fc +s9QVKy+pRAnuP9MSIp755cJ1CODOn2ElNCqnxxsZmcWcmI3LkHAwTmegl3PVvhrk +MKMEA/neshh/M/hWGNTFt77Hoa7pU9dv5RCWFvZPqsUgPrwGrmUvcmSDir3lSWQm +SuSED2LKVo+BFqwWS+jp49AR9b8B/Q== +-----END CERTIFICATE----- diff --git a/servlet/java-configuration/authentication/x509/server/dianne.p12 b/servlet/java-configuration/authentication/x509/server/dianne.p12 new file mode 100644 index 0000000000000000000000000000000000000000..6e5ba218db795c356e8c0aa5df637950e500f0d0 GIT binary patch literal 1768 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 aA_Ne)6!9W(f=}drPhM~u0`Xu10te84%1hP& literal 0 HcmV?d00001 diff --git a/servlet/java-configuration/authentication/x509/server/scott.p12 b/servlet/java-configuration/authentication/x509/server/scott.p12 new file mode 100644 index 0000000000000000000000000000000000000000..f0a6357e730752bd6b2f05658ec8a1a85ade6de9 GIT binary patch literal 1768 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 literal 0 HcmV?d00001 diff --git a/servlet/java-configuration/authentication/x509/server/tomcat.xml b/servlet/java-configuration/authentication/x509/server/tomcat.xml new file mode 100644 index 0000000..5e60156 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/server/tomcat.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/servlet/java-configuration/authentication/x509/settings.gradle b/servlet/java-configuration/authentication/x509/settings.gradle new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/settings.gradle @@ -0,0 +1 @@ + diff --git a/servlet/java-configuration/authentication/x509/src/integTest/java/example/X509Tests.java b/servlet/java-configuration/authentication/x509/src/integTest/java/example/X509Tests.java new file mode 100644 index 0000000..859272a --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/integTest/java/example/X509Tests.java @@ -0,0 +1,84 @@ +/* + * Copyright 2002-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example; + +import java.security.KeyStore; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLHandshakeException; + +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +/** + * Test the Hello World application. + * + * @author Michael Simons + */ +public class X509Tests { + + private int port; + + @BeforeEach + void setup() { + this.port = Integer.parseInt(System.getProperty("app.httpPort", "8443")); + } + + @Test + void notCertificateThenSslHandshakeException() { + RestTemplate rest = new RestTemplate(); + assertThatCode(() -> rest.getForEntity("https://localhost:8443/", String.class)) + .hasCauseInstanceOf(SSLHandshakeException.class); + } + + @Test + void certificateThenStatusOk() throws Exception { + ClassPathResource serverKeystore = new ClassPathResource("/certs/server.p12"); + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore.load(serverKeystore.getInputStream(), "password".toCharArray()); + // @formatter:off + SSLContext sslContext = SSLContexts.custom() + .loadKeyMaterial(keyStore, "password".toCharArray(), (aliases, socket) -> "client") + .loadTrustMaterial(keyStore, null) + .build(); + + SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, + new String[]{"TLSv1.2", "TLSv1.1"}, + null, + SSLConnectionSocketFactory.getDefaultHostnameVerifier()); + // @formatter:on + + CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); + ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + RestTemplate rest = new RestTemplate(requestFactory); + ResponseEntity responseEntity = rest.getForEntity("https://localhost:8443/me", String.class); + assertThat(responseEntity).extracting((result) -> result.getStatusCode().is2xxSuccessful()).isEqualTo(true); + } + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/ApplicationConfiguration.java b/servlet/java-configuration/authentication/x509/src/main/java/example/ApplicationConfiguration.java new file mode 100644 index 0000000..9b01227 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/ApplicationConfiguration.java @@ -0,0 +1,26 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan +public class ApplicationConfiguration { + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/MeController.java b/servlet/java-configuration/authentication/x509/src/main/java/example/MeController.java new file mode 100644 index 0000000..ff4c7ea --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/MeController.java @@ -0,0 +1,38 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example; + +import java.security.Principal; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Says hello to the current user. + * + * @author Rob Winch + * @since 5.5 + */ +@RestController +public class MeController { + + @GetMapping("/me") + public String me(Principal principal) { + return "Hello, " + principal.getName(); + } + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/MvcWebApplicationInitializer.java b/servlet/java-configuration/authentication/x509/src/main/java/example/MvcWebApplicationInitializer.java new file mode 100644 index 0000000..a45eec0 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/MvcWebApplicationInitializer.java @@ -0,0 +1,46 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example; + +import javax.servlet.Filter; + +import org.springframework.web.filter.HiddenHttpMethodFilter; +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + @Override + protected Class[] getRootConfigClasses() { + return null; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[] { ApplicationConfiguration.class }; + } + + @Override + protected String[] getServletMappings() { + return new String[] { "/" }; + } + + @Override + protected Filter[] getServletFilters() { + return new Filter[] { new HiddenHttpMethodFilter() }; + } + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityConfiguration.java b/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityConfiguration.java new file mode 100644 index 0000000..2006a22 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityConfiguration.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package example; + +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +import static org.springframework.security.config.Customizer.withDefaults; + +@EnableWebSecurity +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Override + // @formatter:off + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests((authorizeRequests) -> + authorizeRequests + .anyRequest().authenticated() + ) + .x509(withDefaults()); + } + // @formatter:on + + // @formatter:off + @Bean + public UserDetailsService userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("client") + .password("password") + .roles("USER") + .build(); + UserDetails dianne = User.withDefaultPasswordEncoder() + .username("dianne") + .password("password") + .roles("USER") + .build(); + UserDetails rod = User.withDefaultPasswordEncoder() + .username("rod") + .password("password") + .roles("USER", "ADMIN") + .build(); + UserDetails scott = User.withDefaultPasswordEncoder() + .username("scott") + .password("password") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user, dianne, rod, scott); + } + // @formatter:on + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityWebApplicationInitializer.java b/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000..848385d --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/SecurityWebApplicationInitializer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; +import org.springframework.security.web.session.HttpSessionEventPublisher; + +/** + * We customize {@link AbstractSecurityWebApplicationInitializer} to enable the + * {@link HttpSessionEventPublisher}. + * + * @author Rob Winch + */ +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { + + @Override + protected boolean enableHttpSessionEventPublisher() { + return true; + } + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/java/example/WebMvcConfiguration.java b/servlet/java-configuration/authentication/x509/src/main/java/example/WebMvcConfiguration.java new file mode 100644 index 0000000..07f5af3 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/java/example/WebMvcConfiguration.java @@ -0,0 +1,26 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@EnableWebMvc +@Configuration +public class WebMvcConfiguration { + +} diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.cer b/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.cer new file mode 100644 index 0000000..c9ddc65 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.cer @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIEKA49bjANBgkqhkiG9w0BAQsFADBfMQswCQYDVQQGEwJV +UzELMAkGA1UECBMCSUwxEDAOBgNVBAcTB0NoaWNhZ28xDzANBgNVBAoTBnNwcmlu +ZzERMA8GA1UECxMIc2VjdXJpdHkxDTALBgNVBAMTBHVzZXIwHhcNMjAwNzI3MTk0 +MjUyWhcNMjAxMDI1MTk0MjUyWjBfMQswCQYDVQQGEwJVUzELMAkGA1UECBMCSUwx +EDAOBgNVBAcTB0NoaWNhZ28xDzANBgNVBAoTBnNwcmluZzERMA8GA1UECxMIc2Vj +dXJpdHkxDTALBgNVBAMTBHVzZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC33N+wH+nJ5XmAOmX1JqMeqTRInJvoyOxV4x1mf4sUjbbXl0awFmUHQE8M +WgzzcmThUrqc2z4Qk/QA8Wm7WRduFv249zqkzUrAS6/pjq7S5D23xjvFXTrhv9QI +6orwEr4iiucY2CEyw116p20LGvh8dc4SX45HsNHrX4ubvWRL2MXEDdvnL36Ns5Pv +ZVJfGDfNDxLoP9oInAhi8IlrGC//Sc+i232E37/xgdJuT20Fsy2P2ZILUYonUm6S +LihzcXigC5e0dUn1qinFaJWxW61Tkm4vFbIAdlskmlAB21ZRyTfRAM5p4GJyc/LV +zMBb5d6ETyvrtK/dC/b1QLdqb9jxAgMBAAGjITAfMB0GA1UdDgQWBBRRhhAO2eX1 +10oOKyHWbKWPItZr0TANBgkqhkiG9w0BAQsFAAOCAQEAAHiqijmO473ATu3Qc60n +I6SwfHYa4nDMNO2zPkIA/GWb5aHtyyi8aODVUhGpU5TK+2IJ+H5eK1aRm4nC+NHm +r8+UkWfxmi0KPboPTjU+kgPONrKe+6Wz3T9ba6lbQHNXeF0oUOB/TIpznujfhKfh +6tJOK5A/Y4dw21hE36PO1LlY0IL4xjsZisvcgg1QvvpfBi5bbS0HxuXmK1+sGc4B +G5oZ5pLGV39Y10PliS7CoSf1ItisgrZsfIsaZsQuyE9/NhuwT6i+E35qVNMH0Ak3 +YJgrlseA9CrQ72HJgWTORwutrbXjyA3UxE3CZ7YYaFKhCOqT+rm9blTUckzXxqL7 +sg== +-----END CERTIFICATE----- diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.keystore b/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.keystore new file mode 100644 index 0000000..e69de29 diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.pem b/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.pem new file mode 100644 index 0000000..abfcdba --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/resources/certs/client.pem @@ -0,0 +1,32 @@ +Bag Attributes + friendlyName: user + localKeyID: 54 69 6D 65 20 31 35 39 35 38 37 38 39 37 32 38 39 35 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC33N+wH+nJ5XmA +OmX1JqMeqTRInJvoyOxV4x1mf4sUjbbXl0awFmUHQE8MWgzzcmThUrqc2z4Qk/QA +8Wm7WRduFv249zqkzUrAS6/pjq7S5D23xjvFXTrhv9QI6orwEr4iiucY2CEyw116 +p20LGvh8dc4SX45HsNHrX4ubvWRL2MXEDdvnL36Ns5PvZVJfGDfNDxLoP9oInAhi +8IlrGC//Sc+i232E37/xgdJuT20Fsy2P2ZILUYonUm6SLihzcXigC5e0dUn1qinF +aJWxW61Tkm4vFbIAdlskmlAB21ZRyTfRAM5p4GJyc/LVzMBb5d6ETyvrtK/dC/b1 +QLdqb9jxAgMBAAECggEAOjSPD8eakFK3+xMBsfEQVKWGKrKBXNk2kB388bTQx6nx +RyDZvObqBriiDav4S51cOESjVQLHDCJ6bU3/hdK3ax+WJNcHVqKy1ltfjhWgXJzq +uOHljB5uhIbgzg3J/CRC0tacQC4znElir3CPQaPBJE169jAP77wXSGcP4Da9qJCm +6Lb8EOMccciBowaZ9yhp7Nv7tPh4kQ/syfunjOwBQPtBhH7OFI8vQ/jmfbDfGVbR +dwTqVbifJHjpcETagKtKxi2+UH6mXfANH172JSuA2Fya2GuMyqmz5E2EQGCaXqRe +TOf7ZnVOBi2YR5Glj/UMyqRG2qHOXFaOO8vI/85cAQKBgQDe8PSq/fs62s10GAL5 +zJoxYSFKnkiyrNUy9tfjFVhQDJZ8CNU31JXN4YFTW5p/lNVVRRQKMEnxq1xQfq7H +d2wIN8vf1Y2nAYSwQFqSUVRhOnfIYPQVCbh9yHjseIb6dqW/KQPuxx1/nW718G7e +B4740hQUQNAX4V0Lzm2ZHf/jMQKBgQDTIHdREX0/D4ReW29D4eojuUJihC3lVmpa +jOA6iH5W6OjGBofmaec1wMhcJWI7tJWzTSX7N/fziJVqsy/hcNN1yypUFMpO4UMp +ciZwNGOq9oY3ujxZdCzZLUYQ87HUs9RN3FbYxRFVEv3Gs1HzVnEe+nBHxEEJ3x6E +2xyNEnBhwQKBgEx99BSvLAHXjOKmUm8O6mDC6L9Ha74SWtwvoYcCjdh5WTCZfz62 +q+eF1e+Z4HqhwEiPeP697sECgJwFu0YpDWIMcuELzpxcgwBONEU7rm3lt6+CxHxr +Z2eQ3xyThgxtpRTfp7/HhbGBfM7ZfdCkW0O4ILeKPVvUMS6Z1zTP/DohAoGBAIEI +mKPNYpTF8QqSK2B7lFQdB7uaOUqvE/UfoHNltIF9e7Z7i1eBZjPuDQZ0OqNu7QdW +oV32iO4ojdlWhm7sO/EEKGyXAEZRWnDcOS3edwOoA8PPaM7rN/XLu8Tki80J0zl6 +7wExADTUlJF6Sx3DuQNL4I+cHHviB47/M2Xs3Q6BAoGBANNWN4mHYe+JH4Lrfc1K +SSAeJRGvtne3HRP/4QtKDVbQhAeU9YqKfWgY3BsHrqlF5bTYd/Otti3IeWLA0gIt +D+bFtVWc3hDl+Tb2W3mvMoETi41qlCXaNGzSTHx283QsC/6DdxOHt1vtMwtsxJ7m +5Hjzfx2RXONw7tC9IRzjc63f +-----END PRIVATE KEY----- diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/curl_app.sh b/servlet/java-configuration/authentication/x509/src/main/resources/certs/curl_app.sh new file mode 100644 index 0000000..dbf7af4 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/resources/certs/curl_app.sh @@ -0,0 +1,2 @@ + curl -vvvv --cacert out/DevCA.crt --cert out/localhost.crt --key out/localhost.key https://localhost:8443/me + diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/server.p12 b/servlet/java-configuration/authentication/x509/src/main/resources/certs/server.p12 new file mode 100644 index 0000000000000000000000000000000000000000..8096cc73b9f82ff372925b81973f1e738917429c GIT binary patch literal 9319 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 literal 0 HcmV?d00001 diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/certs/tomcat.keystore b/servlet/java-configuration/authentication/x509/src/main/resources/certs/tomcat.keystore new file mode 100644 index 0000000..e69de29 diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/logback.xml b/servlet/java-configuration/authentication/x509/src/main/resources/logback.xml new file mode 100644 index 0000000..3ebbcc0 --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/servlet/java-configuration/authentication/x509/src/main/resources/templates/index.html b/servlet/java-configuration/authentication/x509/src/main/resources/templates/index.html new file mode 100644 index 0000000..09634dc --- /dev/null +++ b/servlet/java-configuration/authentication/x509/src/main/resources/templates/index.html @@ -0,0 +1,29 @@ + + + + + Hello Security + + +

+

Hello Security

+
+ +
+
+ + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 7907bfb..3777ed7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,6 +33,7 @@ include ":servlet:java-configuration:authentication:username-password:form" include ":servlet:java-configuration:authentication:username-password:in-memory" include ":servlet:java-configuration:authentication:username-password:jdbc" include ":servlet:java-configuration:authentication:username-password:ldap" +include ":servlet:java-configuration:authentication:x509" include ":servlet:java-configuration:data" include ":servlet:java-configuration:hello-mvc-security" include ":servlet:java-configuration:hello-security"