<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Carsten Spräner</title>
	<atom:link href="https://www.spraener.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.spraener.de</link>
	<description>Innovationen für Ihren Erfolg</description>
	<lastBuildDate>Wed, 27 Aug 2025 08:25:25 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://www.spraener.de/wp-content/uploads/2023/12/CS-Icon-gruen.png</url>
	<title>Carsten Spräner</title>
	<link>https://www.spraener.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>10/2023 &#8211; Today: Transportation (Rails)</title>
		<link>https://www.spraener.de/2023/12/11/10-2023-today-transportation-rails/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Mon, 11 Dec 2023 08:09:08 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker-Compose]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[HtmlUnit]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Mockito]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Struts-1]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=2672</guid>

					<description><![CDATA[<p>Modernization of a productive application to current software components. An existing internal application will be converted to modern and currently secure components as part of the contract.Struts-1, Spring 3, Hibernate 3, and similar outdated systems will be replaced. Stability in production had to be guaranteed under all circumstances for the changeover duration. Details Activities Conception, [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/12/11/10-2023-today-transportation-rails/">10/2023 &#8211; Today: Transportation (Rails)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-uagb-container uagb-block-9ed4befe alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<h4 class="wp-block-heading">Modernization of a productive application to current software components. </h4>



<p>An existing internal application will be converted to modern and currently secure components as part of the contract.<br>Struts-1, Spring 3, Hibernate 3, and similar outdated systems will be replaced. Stability in production had to be guaranteed under all circumstances for the changeover duration.</p>



<p><strong>Details</strong></p>



<ul class="wp-block-list">
<li>Integrating AWS Secret Manager</li>



<li>Creation and implementation of JUnit tests</li>



<li>Provide a new implementation of jmockit to run with Java-21</li>



<li>Design and implement the infrastructure for automatic integration tests with selenium</li>



<li>Replacing outdated APIs with new versions</li>



<li>Conversion of the built environment to Docker / docker-compose </li>



<li>General maintenance and care</li>



<li>Guaranteeing production stability</li>
</ul>



<p></p>



<p><strong>Activities</strong></p>



<p>Conception, implementation, and testing of the newly implemented functions with comparative JUnit tests. Converted the backend from Hibernate Criteria API to JPA Builder API and identified software problems during the conversion. Creation of a set of web tests for automatic quality assurance of new versions with HtmlUnit. Introduction of Docker as built and production environment.</p>



<p><strong>IT-Technologies</strong></p>



<p>AWS, Selenium Web Test, Spring 6, Hibernate 5, Docker, docker-compose, Angular, Struts-1 (web-legacy), JUnit, Mockito, JBoss-8, JDK-21, Jenkins</p>
</div></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--1"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/12/11/10-2023-today-transportation-rails/">10/2023 &#8211; Today: Transportation (Rails)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>04/2022 &#8211; 10/2023: Department of Justice</title>
		<link>https://www.spraener.de/2023/10/31/04-2022-10-2023-department-of-justice/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Tue, 31 Oct 2023 18:04:40 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Confluence]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker-Compose]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[IntelliJ]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Lombok]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[MapStruct]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[Mockito]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RedMine]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<category><![CDATA[Swagger]]></category>
		<category><![CDATA[µServices]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=2632</guid>

					<description><![CDATA[<p>Implementing the backend of a lawsuit management software. The German Department of Justice initiated the project and aims to implement nationwide software to manage lawsuits. My task was to design, implement, and test the backend part of this system. Details Activities Design and developing µService endpoints with Spring Boot in consultation with the frontend team. [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/10/31/04-2022-10-2023-department-of-justice/">04/2022 &#8211; 10/2023: Department of Justice</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-uagb-container uagb-block-006649cb alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<h4 class="wp-block-heading">Implementing the backend of a lawsuit management software.</h4>



<p>The German Department of Justice initiated the project and aims to implement nationwide software to manage lawsuits. My task was to design, implement, and test the backend part of this system.</p>



<p><strong>Details</strong></p>



<ul class="wp-block-list">
<li>Developing with IntelliJ and Java-17</li>



<li>API-Specification with openAPI and implement the backend with Spring Boot</li>



<li>Running with Spring Boot</li>



<li>Organized with Jira and GitHub</li>



<li>Build with maven and Jenkins pipeline  <br></li>
</ul>



<p></p>



<p><strong>Activities</strong></p>



<p>Design and developing µService endpoints with Spring Boot in consultation with the frontend team. Test the endpoints with JUnit to get a test coverage above 90%. Describing backend integration tests with IntelliJ HTTP-component.</p>



<p><strong>IT-Technologies</strong></p>



<p>µServices, Spring Boot 2, Java 17, Groovy, Docker, Docker-Compose, Swagger, Lombok, MapStruct, JBoss, J2EE, MySQL/MariaDB, JUnit, Mockito, maven, GIT, Lucene 3.8 / 9.2.0, IntelliJ, Eclipse, Jira, Confluence, GitLab, Jenkins, RedMine</p>
</div></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--2"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>



<p></p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/10/31/04-2022-10-2023-department-of-justice/">04/2022 &#8211; 10/2023: Department of Justice</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SpringBoot &#8211; SAML 2.0 &#8211; KeyCloak</title>
		<link>https://www.spraener.de/2023/09/14/springboot-saml-2-0-keycloak/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Thu, 14 Sep 2023 14:29:51 +0000</pubDate>
				<category><![CDATA[KeyCloak in Spring Boot]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[KeyCloak]]></category>
		<category><![CDATA[OATUH 2]]></category>
		<category><![CDATA[SAML]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Spring Boot 3]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=575</guid>

					<description><![CDATA[<p>There are some examples on the internet to demonstrate how to configure spring-boot version 3+ to use a SAML 2.0 identity provider, but they are using OKTA and not KeyCloak. This is a demo of implementing SAML 2.0 with spring boot using KeyCloak as IDP. It was pretty challenging because of the little changes to [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/09/14/springboot-saml-2-0-keycloak/">SpringBoot &#8211; SAML 2.0 &#8211; KeyCloak</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="taxonomy-post_tag has-link-color wp-elements-0246d7792e0d2afcd98ec102cfb790c1 wp-block-post-terms has-text-color has-ast-global-color-3-color has-background has-ast-global-color-4-background-color"><a href="https://www.spraener.de/tag/java/" rel="tag">Java</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/keycloak/" rel="tag">KeyCloak</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/oatuh-2/" rel="tag">OATUH 2</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/saml/" rel="tag">SAML</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/security/" rel="tag">Security</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/spring-boot-3/" rel="tag">Spring Boot 3</a></div>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>


<p>There are some examples on the internet to demonstrate how to configure spring-boot version 3+ to use a SAML 2.0 identity provider, but they are using OKTA and not KeyCloak.</p>
<p>This is a demo of implementing SAML 2.0 with spring boot using KeyCloak as IDP. It was pretty challenging because of the little changes to be made when using KeyCloak instead of Okta or adfs.</p>
<h3>Example available!</h3>
<p>I implemented an example of a spring boot application with KeyCloak and SAML 2.0. You can find it at github here:<br /><a href="https://github.com/carstenSpraener/keycloak-examples" target="_blank" rel="noopener nofollow">https://github.com/carstenSpraener/keycloak-examples</a> <br /><br /></p>
<h3>Tip</h3>
<p>Error detection in SAML can be challenging. But it can be simplified by installing some SAML debugging plugins into the browser. I had a good experience with the SAML Tracer plugin. When you activate, it will record the SAML-Requests and show them in a separate panel:</p>
<p><img fetchpriority="high" decoding="async" class="alignnone" src="https://www.spraener.de/wp-content/uploads/2023/09/samltracer-300x245.png" alt="" width="361" height="295" /></p>
<h3>Necessary steps</h3>
<p>The necessary steps are the same as using Okta, adsf, or any other SAML 2.0 platform. They are:</p>
<ul>
<li>Create a basic spring boot application.</li>
<li>Configure a client in a realm to use SAML 2.0.</li>
<li>Configure Spring Boot to use SAML 2.0 as SSO implementation.</li>
<li>Connect them via metadata URL and private key.</li>
</ul>
<p>It&#8217;s quite simple, but the devil is in the details. So, let&#8217;s go through all these steps in Detail.</p>
<h3>Create a basic spring boot application</h3>
<p>This task is nearly out of the box, but you have to add the following dependencies to your Gradle/maven project (example for Gradle):</p>
<pre><code class="language-groovy">implementation 'org.spring framework.boot:spring-boot-starter-security'

implementation 'org.spring framework.security:spring-security-saml2-service-provider:6.1.2'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'</code></pre>
<p><strong>And here is the first Detail!</strong> Spring security for saml 2.0 relies on openSaml, which is not hosted on the standard maven repository. So you have to add the following repository to your build file:</p>
<pre><code class="language-groovy">repositories {
    mavencentral()
    maven {
        url "https://build.shibboleth.net/maven/releases"
    }
}</code></pre>
<p>Now, Gradle can resolve the dependency to openSaml.</p>
<h3>Configuring a client for SAML 2.0 in KeyCloak</h3>
<p>You should know what a realm is and how to create one in KeyCloak.</p>
<p><img decoding="async" class="" src="https://www.spraener.de/wp-content/uploads/2023/09/create-realm-300x145.png" alt="" width="348" height="168" /></p>
<p>So now, this Realm has to be selected, and a new client has to be created inside that Realm.</p>
<p>Here are the steps:</p>
<p><strong>Again:</strong> Be sure that you selected the correct Realm.</p>
<h3>Create a new client in that Realm</h3>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/create-client-300x159.png" alt="" /></p>
<p><strong><br />Notice:</strong></p>
<ul>
<li>Client Type is SAML. The default is OpenID Connect. This default has to be changed.</li>
<li><strong>Detail!</strong> The ClientId is the saml2 service provider metadata URL.</li>
<li>The rest is for information.</li>
</ul>
<p>On the second page, you need to add the following information:</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/create-client-page2-300x161.png" alt="" /></p>
<ul>
<li>The Root URL is the URL of the spring boot application.</li>
<li>The Home URL is the Homepage URL of the application.</li>
<li>Valid redirect URIs are the URI(s) to which the user is redirected after a valid login.</li>
<li>The <em>IDP-Initiated SSO URL name</em> is a postfix for a KeyCloak URL that can be called to log in to the client via KeyCloak. This URL is for IDP-initiated (in this case KeyCloak initiated) login.</li>
</ul>
<p>Enable Logout in KeyCloak</p>
<p>When your client initiates a logout, the user should be redirected to the Spring Boot Application after the logout succeeded. It would be best to tell KeyCloak which URL the user should be redirected to. Open the <em>Advanced</em> tab in the client&#8217;s panel and go to the Logout Service POST Binding URL field.</p>
<p>Here, enter the URL <code>/logout/saml2/slo</code>. As shown here:</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/keycloak-logout-posturl.png" alt="" /></p>
<p>That&#8217;s it for now. Hit the save button, and your client is created in KeyCloak.</p>
<p>KeyCloak now knows about a client app that will use it as an IDP with the SAML protocol. But the relationship has to be trusted. So, there has<br />to be some key exchanges. We will do that in a further step. But first, let&#8217;s go to the spring boot side to use KeyCloak and create the needed keys and certificates.</p>
<h3>Binding your spring boot application to KeyCloak SAML</h3>
<p>The SAML-2.0 support for spring boot relies on two main classes that must be created and configured. It is the SecurityFilterChain and a RelyingPartyRegistrationRepository.</p>
<p>The Spring Boot app is the relying party because it relies on the assertions are given from the assertion parts (KeyCloak in this case).</p>
<p>The RelyingPartyRegistrationRepository stores the registration of this relying party to some assertion party by a registration ID.</p>
<h3>Creating keys and certificates</h3>
<p>SAML communicates via XML-Messages routed through the browser. The messages need to be at least signed to protect them from fake messages. For this purpose, the application requires a key and a certificate to sign the messages sent from the application to KeyCloak. (As it is needed for logout)</p>
<p>To create a pair of keys and certificates, go to then<br /><code>src/main/resources/config</code> directory and execute the following<br />command:</p>
<pre><code class="language-bash">openssl req -newkey rsa:2048 -nodes -keyout rp-key.key -x509 -days 365 -out rp-certificate.crt</code></pre>
<p>This command will create two files, <code>rp-key.key</code> and <code>rp-certificate.key</code>. These are the credentials that the Spring Boot application will use to sign messages for KeyCloak. They are valid for 365 days.</p>
<p>Now open the <code>application.yaml</code> file and configure these two files there so we can easily refer them from the application:</p>
<pre><code class="language-yam">saml2:
  rp:
    signing:
      # This pair was generated with the following command:
      # openssl req -newkey rsa:2048 -nodes -keyout rp-key.key -x509 -days 365 -out rp-certificate.crt
      cert-location: /config/rp-certificate.crt
      key-location: /config/rp-key.key
</code></pre>
<p>With this, we can later refer to the files in any spring boot component<br />by:</p>
<pre><code class="language-java">@Value("${saml2.rp.signing.cert-location}")
private String rpSigningCertLocation;

@Value("${saml2.rp.signing.key-location}")
private String rpSigningKeyLocation;</code></pre>
<h3>KeyCloak-Certificate</h3>
<p>The third certificate needed is the KeyCloak signing certificate, which the application needs to verify that the message is coming from KeyCloak. To get the certificate, go to the KeyCloak administration site, make sure you selected the right Realm, and then go to <em>Realm Setting </em>and open the <em>Keys</em> Tab. The correct certificate is the RSH256 with Use &#8222;SIG&#8220;. Click on the marked <em>Certificate</em> button:</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/keycloak-open-certificate.png" alt="" /></p>
<p>This button will open the certificate that you can copy into the clipboard.</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/keycloak-certificate-view-298x300.png" alt="" /></p>
<p>When you copy the certificate into the clipboard, open the application.yaml and paste the certificate under the key <code>saml2.ap.signing-cert</code> like this:</p>
<pre><code class="language-yaml">saml2:
  ap:
    signing-cert: MIICqTCCAZECBgGJiC2o2jANBgkqhkiG...</code></pre>
<p>The certificate can also be found in the same descriptor XML of your Realm. It is the body of the element <code>X509Certificate</code>.</p>
<p><strong>Note:</strong> This is my way of referring to the keys and certificates. There are many other ways to do so. But, well, this is how I did it.</p>
<p>No, let&#8217;s get back to the spring boot application.</p>
<h3>Enable and Configure Spring Boot security</h3>
<p>The next step is to create a configuration bean that also enables SpringSecurity. For that, create a new class and do the following annotation at the class level:</p>
<pre><code class="language-java">@Configuration
@EnableWebSecurity
public class SamlServiceProviderConfig { 
    ...</code></pre>
<p>These annotations mark the class as a configuration source and will also enable web security for the application.</p>
<p>Next, we need a bean that configures the HTTP security. This configuration is done by creating a new method that returns a SecurityFilterChain and receives a HttpSecurity parameter. Here is an example:</p>
<pre><code class="language-java">import static org. spring framework.security.config.Customizer.withDefaults;
...

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    HTTP
        .authorizeHttpRequests(authorize -&gt; authorize
            .requestMatchers("/ping").permitAll()
            .requestMatchers("/").permitAll()
            .requestMatchers("**").authenticated()
        )
        .logout( logout -&gt; logout
            .logoutUrl("/")
        )
        //Configure saml2 login with the default values
        .saml2Login(withDefaults())
        // configure saml2 logout with the default values
        .saml2Logout(withDefaults())
    ;
    return http.build();
}</code></pre>
<p>The first part is a typical spring boot security setup based on URL patterns. For SAML, you need to set up saml2Login and saml2Logout with default values.</p>
<p>The method <code>withDefaults()</code> comes from the static import of the class <br /><code>Customizer</code> , which is shown in the first line.</p>
<p>As mentioned above, we need to create and configure a RelyingPartyRegistrationRepository.<br />So, there needs to be a second method that creates this repository:</p>
<pre><code class="language-java">@Value("${saml2.ap.metadata.location}")
private String metadataLocation;

...

@Bean
public RelyingPartyRegistrationRepository relyingPartyRegistrations() throws Exception {
    Resource signingCertResource = new ClassPathResource(this.rpSigningCertLocation);
    Resource signingKeyResource = new ClassPathResource(this.rpSigningKeyLocation);
    try (
            InputStream is = signingKeyResource.getInputStream();
            InputStream certIS = signingCertResource.getInputStream();
    ) {
        X509Certificate rpCertificate = X509Support.decodeCertificate(certIS.readAllBytes());
        RSAPrivateKey rpKey = RsaKeyConverters.pkcs8().convert(is);
        final Saml2X509Credential rpSigningCredentials = Saml2X509Credential.signing(rpKey, rpCertificate);

        X509Certificate apCert = X509Support.decodeCertificate(apCertificate);
        Saml2X509Credential apCredential = Saml2X509Credential.verification(apCert);

        RelyingPartyRegistration registration = RelyingPartyRegistrations
                .fromMetadataLocation(metadataLocation)
                .registrationId("saml-app")
                .singleLogoutServiceLocation("{baseUrl}/logout/saml2/slo")
                .signingX509Credentials(c -&gt; c.add(rpSigningCredentials))
                .assertingPartyDetails(party -&gt; party
                        .wantAuthnRequestsSigned(true)
                        .verificationX509Credentials(c -&gt; c.add(apCredential))
                )
                .build();
        return new InMemoryRelyingPartyRegistrationRepository(registration);
    }
}</code></pre>
<p>That&#8217;s much stuff going on here. But let&#8217;s break it down.</p>
<p>The first rows are about reading the certificates and keys used to sign and verify the SAML messages. As we configured two values to hold the path to the files, we can now easily access them, create a Resource for them, open an InputStream to the files, and create a Saml2X509Credetial object:</p>
<pre><code class="language-java">X509Certificate rpCertificate = X509Support.decodeCertificate(certIS.readAllBytes());
RSAPrivateKey rpKey = RsaKeyConverters.pkcs8().convert(is);
final Saml2X509Credential rpSigningCredentials = Saml2X509Credential.signing(rpKey, rpCertificate);</code></pre>
<p><strong>Detail!</strong> To use the certificate and key for signing, you have to create the credential with the Saml2X509Credential.<strong>singning()</strong> method.</p>
<p>To create the assertion party verification credentials, we have to get the certificate from the application.yaml, decode it to an X509 certificate, and generate its verification credentials.</p>
<pre><code class="language-java">X509Certificate apCert = X509Support.decodeCertificate(apCertificate);
Saml2X509Credential apCredential = Saml2X509Credential.verification(apCert);</code></pre>
<p><strong>Detail!</strong> To create a signing verification credential object, you have to call the Saml2X509Credential.<strong>verification()</strong> method!</p>
<p><strong>Don&#8217;t mix up the singing and verification methods of the Saml2X509Credential class. That costs me some time to debug.</strong></p>
<h3>Create the registration</h3>
<p>The following lines of code are about creating a registration. This registration tells SAML2 in Spring Boot what your identity provider is and how to verify it.</p>
<p>So the line is:</p>
<pre><code class="language-java">@Value("${saml2.ap.metadata.location}")
private String metadataLocation;

...

RelyingPartyRegistration registration = RelyingPartyRegistrations
        .fromMetadataLocation(metadataLocation)
        .registrationId("saml-app")
        .singleLogoutServiceLocation("{baseUrl}/logout/saml2/slo")
        .signingX509Credentials(c -&gt; c.add(rpSigningCredentials))
        .assertingPartyDetails(party -&gt; party
                .wantAuthnRequestsSigned(true)
                .verificationX509Credentials(c -&gt; c.add(apCredential))
        )
        .build();</code></pre>
<p>The used <code>metadata location</code> is the URL to the SAML-Descriptor of your Realm.<br />This URL can be found on the KeyCloak <em>Realm Settings</em> page:</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/link-to-keycloak-saml-metadata.png" alt="" /></p>
<p>Copy that links address and add it to the application.yaml under the key<br /><code>saml2.ap.metadata.location</code> like:</p>
<pre><code class="language-yaml">saml2:
  ap:
    metadata:
      location: http://localhost:8080/realms/SAML-IDP-Test/protocol/saml/descriptor
    signing-cert: MIICqTCCAZECBgGJiC2o2j...</code></pre>
<p>With this link stored in the variable <code>metadataLocation</code> we can now start and create the <code>RelyingPartyRegistration</code> by using <strong>ATTENTION</strong> <code>RelyingPartyRegistrations</code> <strong>(plural) </strong>to build the desired instance.</p>
<p>You have to set the following values:</p>
<ul>
<li>the metadata location</li>
<li>the registrationId: This is an arbitrary string. With this string, saml can refer to this APs registration.</li>
<li>a singleLogoutServicelocation as seen in the example</li>
<li>the signing certificate created in the previous step</li>
<li>and the assertingParty parameters.</li>
</ul>
<p>Our asserting party wants the Authentication Requests to be signed, and it will sign its requests with the certificate stored in the apCredential.</p>
<p><strong>Detail!</strong> The Certificate is also included in the descriptor.xml of the IDP/AP, but for some reason, it did not work without setting it explicitly in the RelyingPartyRegistration.</p>
<h3>Importing RP-Certificate into KeyCloak</h3>
<p>We established a secured connection from the IDP/AP (KeyCloak) to the RP (Spring-Boot Application) with the above steps. But we still need to tell KeyCloak about the signature of the Spring-Boot Application. This upload of the certificate is the final step to establishing the connection.</p>
<h3>Import the RPs key into KeyCloak</h3>
<p>Go to the KeyCloak administrators page. <strong>Check that the correct Realm is selected</strong>.<br />Then, navigate to the <em>Clients</em> Panel, select the Spring-Boot App client, and open the <em>Keys</em> tab. It should look like this:</p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/keycloak-import-rp-certificate.png" alt="" /></p>
<p>The <strong>Import Key</strong> button will open a file import dialog. Choose the<br /><code>src/main/resources/config/rp-certificate.crt</code> File as the certificate to<br />import. Select <em>Certificate PEM</em> as <em>Archive format</em> and press <em>Import</em></p>
<p><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/09/keycloak-certe-import.png" alt="" /></p>
<p>Well done! Your login into the application via SAML with KeyCloak as an IDP. It should work now.</p>
<p><strong>But wait!</strong> There is no user&#8230; So, create a user in the Realm, and you should be able to log in with that user.</p>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="taxonomy-post_tag wp-block-post-terms"><a href="https://www.spraener.de/tag/java/" rel="tag">Java</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/keycloak/" rel="tag">KeyCloak</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/oatuh-2/" rel="tag">OATUH 2</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/saml/" rel="tag">SAML</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/security/" rel="tag">Security</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/spring-boot-3/" rel="tag">Spring Boot 3</a></div>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--3"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/09/14/springboot-saml-2-0-keycloak/">SpringBoot &#8211; SAML 2.0 &#8211; KeyCloak</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>07/2023 &#8211; Today: Learning the TALL-Stack (Advanced Training)</title>
		<link>https://www.spraener.de/2023/07/31/tall-stack-advanced-training/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Mon, 31 Jul 2023 07:41:00 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[AlpineJS]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Livewire]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PhpStorm]]></category>
		<category><![CDATA[Tailwind-CSS]]></category>
		<category><![CDATA[VisualParadigm]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=2816</guid>

					<description><![CDATA[<p>Creation of a model-driven approach for the TALL stack. Within the openSource project cgv19 a model driven approach for the TALL stack (TailwindCSS, AlpineJS, Livewire, Laravel) and the Laravel extension Filament-3 was developed. The project is developed and available as an openSource project on https://github.com/carstenSpraener/cgV19 It can generate a runnable application from a diagram, as [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/31/tall-stack-advanced-training/">07/2023 &#8211; Today: Learning the TALL-Stack (Advanced Training)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-uagb-container uagb-block-82ccae75 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<h4 class="wp-block-heading">Creation of a model-driven approach for the TALL stack.</h4>



<p>Within the openSource project cgv19 a model driven approach for the TALL stack (TailwindCSS, AlpineJS, Livewire, Laravel) and the Laravel extension Filament-3 was developed. The project is developed and available as an openSource project on<br><br><a href="https://github.com/carstenSpraener/cgV19" target="_blank" rel="noreferrer noopener nofollow">https://github.com/carstenSpraener/cgV19</a><br><br>It can generate a runnable application from a diagram, as shown here:<br><br></p>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="644" height="278" src="https://www.spraener.de/wp-content/uploads/2023/12/image.png" alt="" class="wp-image-2818" style="width:978px;height:auto" srcset="https://www.spraener.de/wp-content/uploads/2023/12/image.png 644w, https://www.spraener.de/wp-content/uploads/2023/12/image-300x130.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></figure>



<p></p>



<p><strong>Details</strong></p>



<ul class="wp-block-list">
<li>Familiarization with Laravel, Tailwind CSS, AlpineJS, Livewire and Filament-3.</li>



<li>Implementation of the cartridge for Laravel (LowCode for Laravel/Filament with cgv19)</li>
</ul>



<p></p>



<p><strong>Activities</strong></p>



<p>Implementation of templates for cgv19 according to programming standards in Laravel and Filament. Implementation of tests for the code generators. Optimization of the generated PHP sources for round-trip engineering with model-driven methods.</p>



<p><strong>IT-Technology</strong></p>



<p>Tailwind CSS, AlpineJS, Livewire, Laravel, PhpStorm, Visual Paradigm, PHP-8, cgv19, Groovy</p>
</div></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--4"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/31/tall-stack-advanced-training/">07/2023 &#8211; Today: Learning the TALL-Stack (Advanced Training)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>07/2023 &#8211; Today: Prototype of a Symfony Application (Own Development)</title>
		<link>https://www.spraener.de/2023/07/31/prototype-symfony-application/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Mon, 31 Jul 2023 07:11:00 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[cgv19]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PhpStorm]]></category>
		<category><![CDATA[Symfony 5]]></category>
		<category><![CDATA[VisualParadigm]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=2811</guid>

					<description><![CDATA[<p>Comparison of the cross-language concepts of Spring Boot and Symfony. In the context of further education and for training purposes, an application was developed with Spring Boot and Symfony in parallel. The goal was to compare Spring-Boot and Symfony concepts and develop a small application that can be run on a server. The application was [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/31/prototype-symfony-application/">07/2023 &#8211; Today: Prototype of a Symfony Application (Own Development)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-uagb-container uagb-block-f2e84805 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<h4 class="wp-block-heading">Comparison of the cross-language concepts of Spring Boot and Symfony.</h4>



<p>In the context of further education and for training purposes, an application was developed with Spring Boot and Symfony in parallel. The goal was to compare Spring-Boot and Symfony concepts and develop a small application that can be run on a server. The application was made publicly available on IONOS.<br><br>See <a href="https://symfony.spraener.de/" target="_blank" rel="noreferrer noopener nofollow">https://symfony.spraener.de</a></p>



<p><strong>Details</strong></p>



<ul class="wp-block-list">
<li>Implementing the backend using Symfony as an API server and comparing it to API development in Spring Boot</li>



<li>Front-end development with TWIG compared to Thymeleaf</li>



<li>Deploying a web component for use in any web application</li>



<li>Model-driven development with cgv19 (see above)</li>
</ul>



<p></p>



<p><strong>Activities</strong></p>



<p>Conception of the implementation with Symfony using a model-driven approach. Comparison of concepts between Spring Boot and Symfony. Implement the backend with Symfony, the frontend with TWIG, and the web component with JavaScript.</p>



<p><strong>IT-Technologies</strong></p>



<p>Symfony 5, PhpStorm, Visual Paradigm, PHP-8, JavaScript, HTML 5, CSS 3, cgv19</p>
</div></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--5"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/31/prototype-symfony-application/">07/2023 &#8211; Today: Prototype of a Symfony Application (Own Development)</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using KeyCloak on your local machine</title>
		<link>https://www.spraener.de/2023/07/25/using-keycloak-on-your-local-machine/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Tue, 25 Jul 2023 18:56:03 +0000</pubDate>
				<category><![CDATA[KeyCloak in Spring Boot]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[KeyCloak]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<guid isPermaLink="false">http://www.spraener.de/?p=555</guid>

					<description><![CDATA[<p>Every project with more than one user must have some authentication and authorization. These days, there is a quite handy and easy to user solution for user management that comes in a project called [KeyCloak](https://www.keycloak.org/ "KeyCloak"). KeyCloak provides all necessary functionality like user registration, sign-in, and sign-in via Google, Facebook, and whatnot, all with support for modern standards like OICD. </p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/25/using-keycloak-on-your-local-machine/">Using KeyCloak on your local machine</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="taxonomy-post_tag has-link-color wp-elements-0246d7792e0d2afcd98ec102cfb790c1 wp-block-post-terms has-text-color has-ast-global-color-3-color has-background has-ast-global-color-4-background-color"><a href="https://www.spraener.de/tag/java/" rel="tag">Java</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/keycloak/" rel="tag">KeyCloak</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/spring-boot/" rel="tag">Spring Boot</a></div>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>


<p>Every project with more than one user must have some authentication and authorization. These days, a quite handy and easy-to-use solution for user management comes in a project called <a title="KeyCloak" href="https://www.keycloak.org/" rel="nofollow noopener" target="_blank">KeyCloak</a>. KeyCloak provides all necessary functionality like user registration, sign-in, and sign-in via Google, Facebook, and whatnot, all supporting modern standards like OICD.</p>
<p>KeyCloak is sponsored by Red Hat and is very well maintained. Regular updates and support for new technologies have been seen in recent years. KeyCloak could be a good choice for every company if it trusts open-source projects.</p>
<p>In this post, I describe how to install KeyCloak on a local machine for development purposes. The Version described here is Version 22.0.1.</p>
<h3>Downloading and starting KeyCloak</h3>
<p>KeyCloak comes in a zip or tar file and can be downloaded from here: <a href="https://www.keycloak.org/downloads" rel="nofollow noopener" target="_blank">https://www.keycloak.org/downloads</a></p>
<p>If you download the zip file, you can extract it wherever you want and start KeyCloak by:</p>
<pre><code class="language-bash">&gt; cd KeyCloak
&gt; bin/bc.sh start-dev</code></pre>
<p><strong>Attention</strong> I tried it with the most recent version 22.0.1 and got an error. KeyCloak 21.1.1 works fine.</p>
<p>After start-up KeyCloak is reachable under the URL</p>
<p><a href="http://localhost:8080" rel="nofollow noopener" target="_blank">http://localhost:8080</a></p>
<p>When you first visit this page, KeyCloak will ask you to set an administrator username and password:</p>
<p><img decoding="async" src="http://www.spraener.de/wp-content/uploads/2023/07/image-1690310899554.png" alt="file" /></p>
<p>Enter the administrator&#8217;s username and password, and you will see the new Welcome screen:</p>
<p><img decoding="async" src="http://www.spraener.de/wp-content/uploads/2023/07/image-1690310988954.png" alt="file" /></p>
<p>Now, you can navigate to the administrator console via the link. Enter<br />the credentials as specified above, and you will see the main page of KeyCloak:</p>
<p><img decoding="async" src="http://www.spraener.de/wp-content/uploads/2023/07/image-1690311083293.png" alt="file" /></p>
<p>YEP! That&#8217;s it. You set up a KeyCloak instance for your personal development.</p>
<h3>What&#8217;s next</h3>
<p>In the next posts, I will set up a realm for development. A Real is an area where users, roles, groups, and clients are managed.</p>
<p>After that, I will bring KeyCloak into a cloud environment with docker-compose, NgInx, and MariaDB.</p>
<h3>Some Notes</h3>
<ul>
<li>Do not use this setup method for production. For production, you have to do a lot more.</li>
<li>I tried the new Version 22.0.1 of KeyCloak and got an error during the start procedure:
<pre><code class="language-bash">ERROR: Failed to run 'build' command.
ERROR: Name is too long
For more details run the same command passing the '--verbose' option. Also you can use '--help' to see the details about the usage of the particular command.</code></pre>
</li>
</ul>
<p>This error is still under investigation&#8230;</p>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="taxonomy-post_tag wp-block-post-terms"><a href="https://www.spraener.de/tag/java/" rel="tag">Java</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/keycloak/" rel="tag">KeyCloak</a><span class="wp-block-post-terms__separator">, </span><a href="https://www.spraener.de/tag/spring-boot/" rel="tag">Spring Boot</a></div>


<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--6"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/07/25/using-keycloak-on-your-local-machine/">Using KeyCloak on your local machine</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>06/2023: IT Service Industry</title>
		<link>https://www.spraener.de/2023/06/30/keycloak_saml-provider/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Fri, 30 Jun 2023 15:23:00 +0000</pubDate>
				<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker-Compose]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[KeyCloak]]></category>
		<category><![CDATA[MagicLink]]></category>
		<category><![CDATA[OIDC]]></category>
		<category><![CDATA[SAML]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=2808</guid>

					<description><![CDATA[<p>KeyCloak as SAML-Provider for a Spring-Boot Application. In preparation for a workshop, a Spring-Boot application was created with KeyCloak as the identity provider. A user can log into the application via SAML or a Magic Link. The Magic Link is sent to the user by mail. Details Activities Implementation of the entire prototype. Creation of [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/06/30/keycloak_saml-provider/">06/2023: IT Service Industry</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-uagb-container uagb-block-886c2e4e alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<h4 class="wp-block-heading">KeyCloak as SAML-Provider for a Spring-Boot Application.</h4>



<p>In preparation for a workshop, a Spring-Boot application was created with KeyCloak as the identity provider. A user can log into the application via SAML or a Magic Link. The Magic Link is sent to the user by mail.</p>



<p><strong>Details</strong></p>



<ul class="wp-block-list">
<li>Implementing a Spring-Boot application with public and protected areas and using the SAML protocol</li>



<li>Implementation of a KeyCloak plugin for Magic Link creation</li>



<li>Connection of the application to a KeyCloak instance</li>



<li>Configuration of KeyCloak as SAML provider and creation of a realm for the prototype</li>



<li>Creation of Magic Links for direct login into the protected area</li>



<li>Creation of multi-layer Dockerfiles for easy operation on any Docker-enabled system</li>



<li>Deployment of the whole system via docker-compose, including database, KeyCloak, Spring boot application</li>
</ul>



<p></p>



<p><strong>Activities</strong></p>



<p>Implementation of the entire prototype. Creation of Dockerfiles to build and run the systems. Deployment of the entire system via docker-compose. Availability via <a href="https://github.com/carstenSpraener/keycloak-examples" data-type="link" data-id="https://github.com/carstenSpraener/keycloak-examples" rel="nofollow noopener" target="_blank">G</a><a href="https://github.com/carstenSpraener/keycloak-examples" target="_blank" data-type="link" data-id="https://github.com/carstenSpraener/keycloak-examples" rel="noreferrer noopener nofollow">itHub</a>.</p>



<p><strong>IT-Technologies</strong></p>



<p>Java 17, Spring-Boot 3, KeyCloak, Docker, docker-compose, SAML, OIDC, MagicLink</p>
</div></div>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--7"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/06/30/keycloak_saml-provider/">06/2023: IT Service Industry</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>KICKS-Starter!</title>
		<link>https://www.spraener.de/2023/02/21/kicks-starter/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Tue, 21 Feb 2023 19:06:16 +0000</pubDate>
				<category><![CDATA[COBOL on Host Beitraege]]></category>
		<category><![CDATA[COBOL on HOST (Hercules Emulator)]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=508</guid>

					<description><![CDATA[<p>&#8230;installing a &#8222;Transaction Monitor&#8220; When I first heard someone talking about COBOL online programs, they always used the term &#8222;transaction monitor&#8220; and CICS. As a Java developer, I wondered why monitoring a database transaction is so important for developing the 3270-Screens. As I learned now, I couldn&#8217;t be more wrong! In &#8222;Jurassic Park&#8220; a &#8222;monitor&#8220; [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/21/kicks-starter/">KICKS-Starter!</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-right">&#8230;installing a &#8222;Transaction Monitor&#8220;</p>



<p>When I first heard someone talking about COBOL online programs, they always used the term &#8222;transaction monitor&#8220; and CICS. As a Java developer, I wondered why monitoring a database transaction is so important for developing the 3270-Screens. As I learned now, I couldn&#8217;t be more wrong!</p>



<p>In &#8222;Jurassic Park&#8220; a &#8222;monitor&#8220; is neither a device to show some UI on a screen nor a program that helps you analyze the control flow of a program. A Monitor is more of some kind of system. (As far as I understood. But let me know if I&#8217;m wrong). And CICS is one of the very first implementations of such a system to handle user Input in a transactional way. All the old systems that turned the world from the 60s to today are developed with this transaction monitor CICS.</p>



<p>So CICS is very similar to Jakarta EE or a REST Controller from a conceptual point of view. It is how you handle user input and process it in an &#8222;All or Nothing&#8220; transactional way.</p>



<p>Since CICS is a commercial product and is not free to the public, there is now a (legal) way to get it run on a Hercules emulator. But there is a free alternative that is somehow compatible with CICS. At least on the API Level.  This alternative is KICKS! </p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="622" src="https://www.spraener.de/wp-content/uploads/2023/02/image-9-1024x622.png" alt="" class="wp-image-509" srcset="https://www.spraener.de/wp-content/uploads/2023/02/image-9-1024x622.png 1024w, https://www.spraener.de/wp-content/uploads/2023/02/image-9-300x182.png 300w, https://www.spraener.de/wp-content/uploads/2023/02/image-9-768x467.png 768w, https://www.spraener.de/wp-content/uploads/2023/02/image-9.png 1452w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">The KICKS start screen on a Hercules MVS/TK4</figcaption></figure>



<p>The installation process of KICKS is quite complicated. The YouTuber<a href="https://youtu.be/u_ZSH9OagTM" target="_blank" rel="noreferrer noopener nofollow"> moshix made a nice video</a> that you can follow up, and you will have a running KICKS-System on your Hercules-driven MVS/TK4 Mainframe. <br>When you finish with video, you should be able to start the KICKS-Transaction-Monitor under the user HERC01.</p>



<p>But I want to use it under my own user ID, and that needs a little extra work. As the <a href="http://www.kicksfortso.com/User&#039;s%20Guide%201.5.0/" target="_blank" rel="noreferrer noopener nofollow">KICKS-Documentation</a> says, you have to allow access to the VSAM-Files to everybody. So log on as HERC01, and open the data set &#8222;SYS2.SECURE.CNTL(PROFILES) and add the following lines to the end. (Unbelievable. I understand what I&#8217;m writing here!)<br></p>



<pre class="wp-block-code"><code>DATASET HERC01.KICKS.MURACH.CUSTMAS                         UPDATE
DATASET HERC01.KICKS.MURACH.INVCTL                          UPDATE
DATASET HERC01.KICKS.MURACH.INVOICE                         UPDATE
DATASET HERC01.KICKS.MURACH.INVOICE.PATH                    UPDATE
DATASET HERC01.KICKS.MURACH.PRODUCT                         UPDATE
DATASET HERC01.KICKS.TACDATA                                UPDATE
DATASET HERC01.KICKS.V1R5M0.SDB                             UPDATE
DATASET HERC01.KICKSSYS.V1R5M0.KIKINTRA                     UPDATE
DATASET HERC01.KICKSSYS.V1R5M0.KIKTEMP                      UPDATE</code></pre>



<p>The editor screen should look something like this:<br></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="242" src="https://www.spraener.de/wp-content/uploads/2023/02/image-10-1024x242.png" alt="" class="wp-image-510" srcset="https://www.spraener.de/wp-content/uploads/2023/02/image-10-1024x242.png 1024w, https://www.spraener.de/wp-content/uploads/2023/02/image-10-300x71.png 300w, https://www.spraener.de/wp-content/uploads/2023/02/image-10-768x182.png 768w, https://www.spraener.de/wp-content/uploads/2023/02/image-10-1536x363.png 1536w, https://www.spraener.de/wp-content/uploads/2023/02/image-10-2048x484.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Saving the file and restart rakf (or the whole Hercules to be saved).</p>



<p>Next, you should copy the member KICKS and KFIX to the SYS2.PROCLIB data set. The tool MOVE/COPY (option 3.3) is very handy for this task, and I managed it without reading any manuals.</p>



<p>When you finish these copies, you can log off and log on as a regular user. CASI, in my case.</p>



<p>Now, it should be able to launch KICKS from the TSO command prompt. I tried and…. failed. After a little research and asking the experts at Discord, it turned out that I forgot the &#8218; !! So the correct command to start KICKS is:</p>



<pre class="wp-block-code"><code>EXEC 'SYS2.CMDPROC(KICKS)'</code></pre>



<p>With this command (AND DO NOT MISS THE APOSTROPHE!), the system will start. Press the CLEAR Button and enter BTC0, and you will see the TAC-Transaction used in the Nevada Department of Labor in the 70s.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="544" src="https://www.spraener.de/wp-content/uploads/2023/02/image-11-1024x544.png" alt="" class="wp-image-511" srcset="https://www.spraener.de/wp-content/uploads/2023/02/image-11-1024x544.png 1024w, https://www.spraener.de/wp-content/uploads/2023/02/image-11-300x160.png 300w, https://www.spraener.de/wp-content/uploads/2023/02/image-11-768x408.png 768w, https://www.spraener.de/wp-content/uploads/2023/02/image-11.png 1452w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Welcome to the Nevada Department of Labor</figcaption></figure>



<p>There are some other transactions also installed. Especially all the examples in Murach&#8217;s bible of &#8222;CICS for the COBOL Programmer&#8220;. I think I&#8217;m now done with installing Hercules, TK4, ROB enhancements, and KICKS. So, the next step could be implementing the first online transaction in COBOL.</p>



<p></p>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--8"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/21/kicks-starter/">KICKS-Starter!</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Running HERCULES 4.X Hyperion in a Docker Container</title>
		<link>https://www.spraener.de/2023/02/20/running-hercules-4-x-hyperion-in-a-docker-container/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Mon, 20 Feb 2023 14:33:11 +0000</pubDate>
				<category><![CDATA[COBOL on Host Beitraege]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=500</guid>

					<description><![CDATA[<p>&#8230; when two worlds come together Hercules is actively developed under the project Hercules Hyperion, and the current release, 4.5 is available on GitHub. I tried to compile it on my macOS but had some trouble with the software not being available, so I decided to give Docker a chance and carry this cute little [&#8230;]</p>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/20/running-hercules-4-x-hyperion-in-a-docker-container/">Running HERCULES 4.X Hyperion in a Docker Container</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">&#8230; when two worlds come together</h3>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="918" src="https://www.spraener.de/wp-content/uploads/2023/02/image-8-1024x918.png" alt="" class="wp-image-501" style="width:209px;height:187px" srcset="https://www.spraener.de/wp-content/uploads/2023/02/image-8-1024x918.png 1024w, https://www.spraener.de/wp-content/uploads/2023/02/image-8-300x269.png 300w, https://www.spraener.de/wp-content/uploads/2023/02/image-8-768x688.png 768w, https://www.spraener.de/wp-content/uploads/2023/02/image-8.png 1116w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Hercules is actively developed under the project <a href="https://github.com/SDL-Hercules-390/hyperion" rel="nofollow noopener" target="_blank">Hercules </a><a href="https://github.com/SDL-Hercules-390/hyperion" target="_blank" rel="noreferrer noopener nofollow">Hyperion,</a><a href="https://github.com/SDL-Hercules-390/hyperion" rel="nofollow noopener" target="_blank"> and </a><a href="https://github.com/SDL-Hercules-390/hyperion" target="_blank" rel="noreferrer noopener nofollow">the</a><a href="https://github.com/SDL-Hercules-390/hyperion" rel="nofollow noopener" target="_blank"> current release, 4.5 is available on GitHub.</a> I tried to compile it on my macOS but had some trouble with the software not being available, so I decided to give Docker a chance and carry this cute little Dinosaur. And it was actually relatively easy.<strong> (Attention: This approach is only tested on x86 architectures. I tried a build on a Raspberry Pi 4 with 64Bit, and it failed due to missing external libraries. I&#8217;m working on it)</strong></p>



<p>First, I cloned the GitHub repository on a local directory.</p>



<pre class="wp-block-code"><code>git clone https://github.com/SDL-Hercules-390/hyperion.git</code></pre>



<p>Then, you will have the whole project on your local drive.  The installation instructions in the project documentation are straightforward, so I followed them up in a Dockerfile. (Copy this Dockerfile into the project directory.)</p>



<pre class="wp-block-code"><code>#
# Start building hercules-hyperion docker image from a debian base
# since it does not need many stuff the slim image should be sufficient
#
# The extra software is installed with apt.
#
FROM debian:stable-slim AS env

RUN mkdir /opt/build &amp;&amp;\
    apt-get update &amp;&amp;\
    apt-get -y install git wget time &amp;&amp;\
    apt-get -y install build-essential cmake flex gawk m4 autoconf automake libtool-bin libltdl-dev &amp;&amp;\
    apt-get -y install libbz2-dev zlib1g-dev &amp;&amp;\
    apt-get -y install libcap2-bin

# No the environment is set and the build can Start
# copy all the project files into the build directory and Start
# building it.
#
FROM env AS build

WORKDIR /opt/build

COPY . /opt/build

RUN ./configure &amp;&amp;\
    mkdir /opt/hercules &amp;&amp;\
    make &amp;&amp;\
    make install &amp;&amp;\
    /sbin/ldconfig -v

#
# With the hercules hyperion build it is no easy to Start
# hercules.
#
# The docker image expects a working area mounted to /opt/hercules
# and in that directory there must be the configuratio under conf/herculues.cnf
# The start script inside the hercules console has to be under scripts/ipl.rc
#
#  &lt;DirecotryMountedUnder/opt/hercules&gt;
#   .
#   +--conf/hercules.cnf
#   +--scripts/ipl.rc
#
FROM build AS hercules-hyperion
WORKDIR /opt/build
VOlUME /opt/hercules

CMD &#91;"/bin/bash", "/opt/build/container-start"]
</code></pre>



<p>The Dockerfile has three stages. The first stage starts from the Debian-slim image and follows the installation instructions of the project documentation. It leaves a stage <strong>env</strong> to use in the next stage.</p>



<p>The stage build copies the entire project into the working directory of the image and follows the make instructions of the project documentation. This leads to a new stage build with a compiled and installed Hercules inside. I only needed to add the <strong>/sbin/ldconfig -v</strong> command to make the Hercules libraries accessible in the image.</p>



<p>The third stage is the final one, which builds the final image and makes Hercules run in a docker container. It uses a little bash script:</p>



<pre class="wp-block-code"><code>#!/bin/bash

(
cd /opt/hercules
export HERCULES_RC=scripts/ipl.rc
hercules -f conf/hercules.cnf -d &gt;3033.log
)
</code></pre>



<p>The script changes to a directory /opt/Hercules sets the environment variable HERCULES_RC to scripts/ipl.rc, and starts the Hercules emulator. As you can see, this script implies some setups from the user.  You have to mount a directory with your own Hercules environment under /opt/Hercules, and in that environment, you have to store the configuration under conf/Hercules.cnf and the startup script under scripts/ipl.rc</p>



<p>Starting Hercules is one thing. But installing the software and bringing it all together is a much more difficult task. At least for me as a Java developer.  There are some readily defined distributions with all devices, dasds, configs, and start scripts needed available, and you surely want to use them. Like the  TK-4 distribution mentioned in the other articles.  This distribution has the configuration under conf/tk4-.cnf. Copy it to conf/Hercules.cnf and you are fine. The start script is under scripts/ipl.rc as the container script requires.</p>



<pre class="wp-block-code"><code>docker build -t hercules-hyperion .</code></pre>



<p>When you start the docker build like:</p>



<p>Docker will create the image. To start the image, use this command:</p>



<pre class="wp-block-code"><code>docker run -v /&lt;YOUR HERCULES ENVIRONMENT DIRECTORY&gt;:/opt/hercules \
    -p 3270:3270 \
    -p 3278:3278 \
    -p 8038:8038 \
    --name hercules \
    hercules-hyperion</code></pre>



<p>Now you have a running Hercules 4.5 Hyperion instance in docker. The ports are exposed to 3270 (3270-Terminal emulation), 3278 (Telnet port), and 8038 (Web-Server)</p>



<div class="wp-block-group alignfull has-ast-global-color-5-background-color has-background is-layout-flow wp-container-core-group-is-layout-8a368f38 wp-block-group-is-layout-flow">
<div class="wp-block-cover is-light" style="min-height:275px;aspect-ratio:unset;"><span aria-hidden="true" class="wp-block-cover__background has-ast-global-color-5-background-color has-background-dim-100 has-background-dim"></span><div class="wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow">
<h3 class="wp-block-heading has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-8326121f7d0c4fd7bdb6cb133e8ddb75">Let&#8217;s Talk About Your Project</h3>



<p class="has-text-align-center has-ast-global-color-2-color has-text-color has-link-color wp-elements-d161da5374100bf47edf893e663ee225">Just send me a message!</p>



<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-03627597 wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--9"><a class="wp-block-button__link has-ast-global-color-3-color has-ast-global-color-0-background-color has-text-color has-background wp-element-button" href="mailto:carsten@spraener.de" target="_blank" rel="noreferrer noopener">Contact Me</a></div>
</div>
</div></div>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/20/running-hercules-4-x-hyperion-in-a-docker-container/">Running HERCULES 4.X Hyperion in a Docker Container</a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title></title>
		<link>https://www.spraener.de/2023/02/20/493/</link>
		
		<dc:creator><![CDATA[Carsten Spräner]]></dc:creator>
		<pubDate>Mon, 20 Feb 2023 13:30:32 +0000</pubDate>
				<category><![CDATA[COBOL on HOST (Hercules Emulator)]]></category>
		<guid isPermaLink="false">https://www.spraener.de/?p=493</guid>

					<description><![CDATA[<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/20/493/"></a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignright size-full is-resized"><img decoding="async" src="https://www.spraener.de/wp-content/uploads/2023/02/image-7.png" alt="" class="wp-image-498" width="223" height="200" srcset="https://www.spraener.de/wp-content/uploads/2023/02/image-7.png 876w, https://www.spraener.de/wp-content/uploads/2023/02/image-7-300x268.png 300w, https://www.spraener.de/wp-content/uploads/2023/02/image-7-768x687.png 768w" sizes="(max-width: 223px) 100vw, 223px" /></figure>


<ul class="lcp_catlist" id="lcp_instance_0"><li><a href="https://www.spraener.de/2023/02/17/running-mvs-on-your-own-emulated-mainframe-or/" class="page-title">Running MVS on your own emulated Mainframe or&#8230;</a><div class="lcp_excerpt">
&#8230; welcome to Jurassic Parc. The world of the Dinosaurs.





I&#8217;ve been a Java programmer since my very first days as a professional software engineer.  Before that, I started programming with BASIC and Assembler on a Commodore +4. During my studies, is programmed C on an ATARI-ST or Solaris Workstations. My first job was in ...</div></li><li><a href="https://www.spraener.de/2023/02/17/installing-and-starting-hercules-and-mvs/" class="page-title">Installing and starting HERCULES and MVS</a><div class="lcp_excerpt">
The easy part&#8230;


installing and starting HERCULES today (2023) really is no problem at all. It can run on any commonly used OS like Windows, macOS, and Linux. I chose my old Raspberry Pi 3B as my mainframe platform. And it does the job quite well for one user. So, how is it going:


My first try ...</div></li><li><a href="https://www.spraener.de/2023/02/20/running-hercules-4-x-hyperion-in-a-docker-container/" class="page-title">Running HERCULES 4.X Hyperion in a Docker Container</a><div class="lcp_excerpt">
&#8230; when two worlds come together





Hercules is actively developed under the project Hercules Hyperion, and the current release, 4.5 is available on GitHub. I tried to compile it on my macOS but had some trouble with the software not being available, so I decided to give Docker a chance and carry this cute little Dinosaur. ...</div></li><li><a href="https://www.spraener.de/2023/02/21/kicks-starter/" class="page-title">KICKS-Starter!</a><div class="lcp_excerpt">
&#8230;installing a &#8222;Transaction Monitor&#8220;


When I first heard someone talking about COBOL online programs, they always used the term &#8222;transaction monitor&#8220; and CICS. As a Java developer, I wondered why monitoring a database transaction is so important for developing the 3270-Screens. As I learned now, I couldn&#8217;t be more wrong!


In &#8222;Jurassic Park&#8220; a &#8222;monitor&#8220; is neither ...</div></li></ul>
<p>Der Beitrag <a rel="nofollow" href="https://www.spraener.de/2023/02/20/493/"></a> erschien zuerst auf <a rel="nofollow" href="https://www.spraener.de">Carsten Spräner</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
