diff --git a/spring-security-x509/keystore/Makefile b/spring-security-x509/keystore/Makefile new file mode 100644 index 0000000000..62f2e1395e --- /dev/null +++ b/spring-security-x509/keystore/Makefile @@ -0,0 +1,76 @@ +PASSWORD=changeit +KEYSTORE=keystore.jks +HOSTNAME=localhost +# CN = Common Name +# OU = Organization Unit +# O = Organization Name +# L = Locality Name +# ST = State Name +# C = Country (2-letter Country Code) +# E = Email +DNAME_CA='CN=Baeldung CA,OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' +# For server certificates, the Common Name (CN) must be the hostname +DNAME_HOST='CN=$(HOSTNAME),OU=baeldung.com,O=Baeldung,L=SomeCity,ST=SomeState,C=CC' +TRUSTSTORE=truststore.jks +CLIENTNAME=cid + +all: clean create-keystore add-host create-truststore add-client + +create-keystore: + # Generate a certificate authority (CA) + keytool -genkey -alias ca \ + -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ + -validity 3650 -dname $(DNAME_CA) \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + +add-host: + # Generate a host certificate + keytool -genkey -alias $(HOSTNAME) \ + -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ + -validity 3650 -dname $(DNAME_HOST) \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + # Generate a host certificate signing request + keytool -certreq -alias $(HOSTNAME) \ + -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ + -validity 3650 -file "$(HOSTNAME).csr" \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + # Generate signed certificate with the certificate authority + keytool -gencert -alias ca \ + -validity 3650 -sigalg SHA512withRSA \ + -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + # Import signed certificate into the keystore + keytool -import -trustcacerts -alias $(HOSTNAME) \ + -file "$(HOSTNAME).crt" \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + +create-truststore: + # Export certificate authority into truststore + keytool -export -alias ca -file ca.crt \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + keytool -import -trustcacerts -noprompt -alias ca -file ca.crt \ + -keystore $(TRUSTSTORE) -storepass $(PASSWORD) + +add-client: + # Generate client certificate + keytool -genkey -alias $(CLIENTNAME) \ + -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ + -validity 3650 -dname $(DNAME_HOST) \ + -keystore $(TRUSTSTORE) -storepass $(PASSWORD) + # Generate a host certificate signing request + keytool -certreq -alias $(CLIENTNAME) \ + -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ + -validity 3650 -file "$(CLIENTNAME).csr" \ + -keystore $(TRUSTSTORE) -storepass $(PASSWORD) + # Generate signed certificate with the certificate authority + keytool -gencert -alias ca \ + -validity 3650 -sigalg SHA512withRSA \ + -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \ + -keystore $(KEYSTORE) -storepass $(PASSWORD) + # Import signed certificate into the truststore + keytool -import -trustcacerts -alias $(CLIENTNAME) \ + -file "$(CLIENTNAME).crt" \ + -keystore $(TRUSTSTORE) -storepass $(PASSWORD) + +clean: + rm -f $(KEYSTORE) *.csr *.crt $(TRUSTSTORE) diff --git a/spring-security-x509/server/pom.xml b/spring-security-x509/server/pom.xml new file mode 100644 index 0000000000..eabd0364ef --- /dev/null +++ b/spring-security-x509/server/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.baeldung.spring.security + server + 0.0.1-SNAPSHOT + jar + + server + Spring x.509 Authentication Demo + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java new file mode 100644 index 0000000000..90c8897d8f --- /dev/null +++ b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/UserResource.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.security.x509; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.security.Principal; + +@Controller +public class UserResource { + + @RequestMapping(value = "/user") + public String user(Model model, Principal principal) { + UserDetails currentUser = (UserDetails) ((Authentication) principal).getPrincipal(); + model.addAttribute("username", currentUser.getUsername()); + return "user"; + } +} diff --git a/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java new file mode 100644 index 0000000000..ab7719df0f --- /dev/null +++ b/spring-security-x509/server/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.security.x509; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class X509AuthenticationServer { + + public static void main(String[] args) { + SpringApplication.run(X509AuthenticationServer.class, args); + } +} diff --git a/spring-security-x509/server/src/main/resources/application.properties b/spring-security-x509/server/src/main/resources/application.properties new file mode 100644 index 0000000000..89a234b1ac --- /dev/null +++ b/spring-security-x509/server/src/main/resources/application.properties @@ -0,0 +1,8 @@ +server.ssl.key-store=../keystore/keystore.jks +server.ssl.key-store-password=${PASSWORD} +server.ssl.key-alias=localhost +server.ssl.key-password=${PASSWORD} +server.ssl.enabled=true +server.port=8443 +security.user.name=Admin +security.user.password=admin \ No newline at end of file diff --git a/spring-security-x509/server/src/main/resources/templates/user.html b/spring-security-x509/server/src/main/resources/templates/user.html new file mode 100644 index 0000000000..0be84680fe --- /dev/null +++ b/spring-security-x509/server/src/main/resources/templates/user.html @@ -0,0 +1,9 @@ + + + + X.509 Authentication Demo + + +

Hello !

+ + \ No newline at end of file diff --git a/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java b/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java new file mode 100644 index 0000000000..f08916c80b --- /dev/null +++ b/spring-security-x509/server/src/test/java/com/baeldung/spring/security/x509/X509AuthenticationServerTests.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.security.x509; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class X509AuthenticationServerTests { + + @Test + public void contextLoads() { + } + +}