web-dev-qa-db-ja.com

春RESTサービス証明書認証

Springコントローラを作成しました。このgetはクライアントからのリクエストです。 RESTスタイルです。

これはとてもいい。しかし、証明書認証が必要です。クライアントのみが残りのサービス(スプリングコントローラ)にアクセスできる必要があります。残りのサービスには、キー付きのクライアント証明書があります(つまり、クライアントにはキー付きのキーストアが必要です)。

このセキュリティを春に設定するにはどうすればよいですか?これが書かれている例やリンクを教えてもらえますか?

ありがとう

14
grep

探しているものは 相互認証 と呼ばれます。

クライアントが証明書を送信するように要求/作成するのはサーバーの責任です。各サーバーはこれを異なる方法で行うため、特定のサーバーを構成する方法を調べる必要があります。

Spring Securityについては、 X.509認証 を検討することをお勧めします。このタイプの認証はかなり使いやすく、必要に応じて拡張できます。

[〜#〜]編集[〜#〜]

だから、ここにあなたが尋ねていることの例を示すいくつかの参考文献があります:

http://whiteycode.blogspot.com/2012/04/part-3-x509-authentication-with-spring.html

PDF警告

http://www.promixis.com/pdfs/SpringSecurityAndX509ClientCertificates.pdf

上記のPDFファイルにアクセスできません...

この例は、証明書の設定方法と独自の個人CA(認証局)の作成方法を説明するのに非常に適しています。警告、クライアント証明書の作成方法は単なる方法であり、方法ではありません。クライアント(IE WebブラウザーまたはJava httpclient client)は、クライアント証明書を作成する方法を決定する必要があります。Javaは、そのJavaキーストアとブラウザは、p12スタイルの証明書を好む傾向があります。

最終的なアドバイス/警告...証明書に関する知識のレベルはわかりませんが...相互認証は、誰が誰を信頼するかについてのすべてです。言うのはサーバーの責任です。証明書で自分を認証する必要があります。ここに、信頼できる証明書プロバイダーのリストを示します。次に、クライアントは、これらのサーバーの信頼できる証明書プロバイダーのいずれかによって署名された証明書で応答する必要があります。次に、アプリケーションの責任であると言います。証明書内の名前に基づいてこの人を信頼しますか?物事がうまくいかなくなった場合、誰が誰であるか、誰が信用していないかを考えてください。

優れたツールの1つは、アプリケーションで-Djavax.net.debug = sslを使用することです。これは、sslハンドシェイク全体と、何が要求されているか、および特定の応答が何であるかを示します。そのオプションは少し冗長ですが、必要なときに用意しておくと便利です。

EDIT X 2

Tomcat 7で相互認証を有効にする方法は次のとおりです。

Server.xml設定ファイルで、SSLコネクタの次の近くを確認します。

<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="want" sslProtocol="TLS"
           keystoreFile="C:\Java\Certs\localhost.jks"
           keystorePass="changeit"
           URIEncoding="UTF-8" />

注意すべき重要な値はclientAuth値です。

ClientAuthを 'want'に設定すると、サーバーが信頼している証明書のリストから証明書のリストから署名済みのクライアントSSL証明書を送信するようにクライアントに指示します(証明書がある場合)。そうでない場合は、先に進んで、通常どおりリクエストを行ってください。

ClientAuthを「true」に設定すると、サーバーが信頼する証明書のリストから署名済みクライアントのSSL証明書を送信する必要があることをクライアントに伝えます。サーバーが信頼する証明書のリストによって署名された証明書がない場合、クライアントは要求を行うことができません。

サーバーが信頼する証明書のリストは、デフォルトのJavaトラストストアから取得するか、-Djavax.net.ssl.trustStore="C:\Java\Certs\jssecacerts1" VMオプションを使用して設定できます。

一般に、信頼できる特定のCA証明書がデフォルトのJavaトラストストアにない場合、デフォルトのトラストストアがコピーされ、新しいCA証明書がコピーされたトラストストアにインポートされて、上記VMオプション。

[〜#〜]警告[〜#〜]

デフォルトを変更しないことが非常に重要ですJava truststore in place。変更した場合、そのマシン上のすべてのJavaアプリケーションはデフォルトで新しいアップデートを使用しますトラストストア:必ずしも人々が望んでいるとは限らず、セキュリティリスクを引き起こす可能性もあります。

20
hooknc

私は、RESTというエンドポイントでSpring Bootアプリをセットアップするために必要なeverythingを使用して、100%包括的なサンプルプロジェクトを作成しました。クライアント証明書によって保護されています-クライアント証明書を使用して保護されたサーバーと通信するように構成されたRestTemplateを備えたテストケース: https://github.com/jonashackt/spring-boot-rest-clientcertificate

また、.key.crt.jksファイルの生成に必要なallステップも含まれています。自己署名証明書を使用したくない場合は、それに応じて手順を調整してください。

RestTemplateは次のように構成されています。

package de.jonashackt.restexamples;

import org.Apache.http.client.HttpClient;
import org.Apache.http.impl.client.HttpClients;
import org.Apache.http.ssl.SSLContextBuilder;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.util.ResourceUtils;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;

@Configuration
public class RestClientCertTestConfiguration {

    private String allPassword = "allpassword";

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {

        SSLContext sslContext = SSLContextBuilder
                .create()
                .loadKeyMaterial(ResourceUtils.getFile("classpath:keystore.jks"), allPassword.toCharArray(), allPassword.toCharArray())
                .loadTrustMaterial(ResourceUtils.getFile("classpath:truststore.jks"), allPassword.toCharArray())
                .build();

        HttpClient client = HttpClients.custom()
                .setSSLContext(sslContext)
                .build();

        return builder
                .requestFactory(new HttpComponentsClientHttpRequestFactory(client))
                .build();
    }
}

その後、Test.class内で@Autowiredアノテーションを使用するのと同じように使用できます。

4
jonashackt