当前位置: 首页 > 知识库问答 >
问题:

使用SSL为JerseyTest配置JettyTestContainer

柳宏深
2023-03-14

我的任务是为团队的代码设置集成测试。这些测试需要对Jersey 2.27中实现的RESTendpoint执行HTTPS请求。在寻找如何执行这种测试的过程中,我偶然发现了Baeldung的这篇文章,这篇文章向我指出了Jersey测试框架和他们为此目的实现的提供者容器。我选择了Jetty容器,因为我们的代码使用了一个“滚动您自己的”Jetty实例来完成这一切。我开始实施我们的测试,但在为提供rest请求的JettyTestContainer配置SSL时遇到了困难。我开始收到一个IllegalArgumentException,声明“当不使用SSL时,URI方案应该是http。”我不知道如何继续下去。

这是我的测试课:

public class ProjectTest extends JerseyTest {



 private SSLContext sslCtx;
    
    @Override
    protected Application configure() {
        ResourceConfig conf = new ResourceConfig(Sets.newHashSet(RestSuite1.class));
        SslConfigurator sslConfig = SslConfigurator.newInstance()
            .trustStoreFile()
            .trustStorePassword()
            .keyStoreFile()
            .keyStorePassword()
        sslCtx = sslConfig.createSSLContext();
    }

    @Override
    public URI getBaseUri() {
        return URI.create("https://localhost:1234")
    }

    @Override
    public Client getClient() {
        return ClientBuilder.newBuilder().sslContext(sslCtx).build();
    }

    @Test
    public void test1() throws Exception { 
        String testString = "HelloWorld";
        OurObject oo = target("/restSuite1")
            .request()
            .post(Entity.entity(testString, MediaType.APPLICATION_JSON), String.class);
    }
}

这是一个RestSuite1:

@Path("restSuite1")
@Produces("application/json")
public class RestSuite1 {
    
    @POST
    @Consumes("application/json")
    @Produces("application/json")    
    public String doSomething(String payload) {
        // Do Something 
    }
}

这是我的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0   
http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  
  <modelVersion>4.0.0</modelVersion>  
  
  <groupId>com.sample</groupId>  
  <artifactId>my-application1</artifactId>  
  <version>1.0</version>  
  <packaging>war</packaging>  
  
  <name>my war</name>  
  <url>http://some-url.com</url>  
  
  <dependencies>  
    <dependency>  
      <groupId>javax.ws.rs</groupId>  
      <artifactId>javax.ws.rs-api</artifactId>  
      <version>2.1</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.containers</groupId>  
      <artifactId>jersey-container-servlet</artifactId>  
      <version>2.27</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.core</groupId>  
      <artifactId>jersey-server</artifactId>  
      <version>2.27</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.core</groupId>  
      <artifactId>jersey-client</artifactId>  
      <version>2.27</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.inject</groupId>  
      <artifactId>jersey-hk2</artifactId>  
      <version>2.27</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.media</groupId>  
      <artifactId>jersey-media-json-jackson</artifactId>  
      <version>2.27</version>  
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.test-framework</groupId>  
      <artifactId>jersey-test-framework-core</artifactId>  
      <version>2.27</version>
      <scope>test</scope>
    </dependency>
    <dependency>  
      <groupId>org.glassfish.jersey.test-framework.providers</groupId>  
      <artifactId>jersey-test-framework-provider-jetty</artifactId>  
      <version>2.27</version>
      <scope>test</scope>
    </dependency>
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.8.2</version>  
      <scope>test</scope>  
    </dependency>  
  </dependencies>  
</project>

我应该注意到,在尝试SSL配置之前,我能够成功地到达POST/restSuite1endpoint。

我发现了这个问题,但它看起来不像是在JerseyTest场景中使用的Grizzly SSL配置。

我发现了这个问题,但它看起来像是设置用户角色,而不是实际的SSL配置。

然后我发现了这个问题,问这个问题的人似乎和我有同样的问题,但从来没有人回答过这个问题。

请帮忙!

共有1个答案

阎宾实
2023-03-14

看起来此选项在JerseyTest中不可用。我创建了一个pull请求来添加此选项。请看这里:https://github.com/eclipse-ee4j/jersey/pull/4573我不太确定他们会以多快的速度批准并发布它。。。

我知道这不是你想要的答案。。。但是,如果您仍然希望使用ssl配置服务器并使用https测试应用程序,而不必等待请求获得批准,那么您可以看看我的github项目,它有一个使用grizzly而不使用JerseyTest测试jersey服务器的基本示例:application

=============更新#1 20-12-2020===============

拉取请求已被批准、合并和发布。现在可以从2.33版开始使用。现在可以提供带有SSLPareters的sslcontext来配置jersey测试。设置示例如下:

java prettyprint-override">public class SecuredJerseyTest extends JerseyTest {

    @Override
    protected TestContainerFactory getTestContainerFactory() {
        return new GrizzlyTestContainerFactory();
    }

    @Path("hello")
    public static class TestResource {
        @GET
        public String hello() {
            return "hello";
        }
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(TestResource.class);
    }

    @Override
    protected URI getBaseUri() {
        return UriBuilder
                .fromUri("https://localhost")
                .port(getPort())
                .build();
    }

    @Override
    protected Optional<SSLContext> getSslContext() {
        SSLContext sslContext = ... // your initialised server sslContext 
        return Optional.of(sslContext);
    }

    @Override
    protected Optional<SSLParameters> getSslParameters() {
        serverSslParameters = new SSLParameters();
        serverSslParameters.setNeedClientAuth(false);
        return Optional.of(serverSslParameters);
    }

    @Test
    public void testHello() {
        SSLContext sslContext = ... // your initialised client sslContext 

        Client client = ClientBuilder.newBuilder()
                .sslContext(sslContext)
                .build();

        WebTarget target = client.target(getBaseUri()).path("hello");

        String s = target.request().get(String.class);
        Assert.assertEquals("hello", s);
    }
}
 类似资料:
  • 谈到SSL,我是个新手。所以我可以在这里使用一些关于我的情况的专业知识。 我有一个基于Java的web应用程序,可以进行SSL API调用。API和web应用程序都托管在同一台服务器上(

  • 我们正在使用cloudfront为具有自定义域的图像提供服务。 我们希望能够使用SSL访问它们,例如

  • 问题内容: 我正在尝试从使用用户名和密码登录到我的MySQL数据库服务器的未加密JDBC连接转移到使用SSL和基于证书的身份验证的连接。我在Spring MVC中使用Hibernate。我的WebAppConfig文件如下所示: 而我的属性配置文件(application.properties)如下: 我已经在/ etc / mysql / certs内部生成了正确的证书,并编辑了my.cnf以指

  • 问题内容: 我正在尝试使用axios向api端点发出请求,但出现以下错误: 似乎axios使用的https模块无法验证服务器上使用的SSL证书。 使用浏览器访问服务器时,证书有效,我可以查看/下载该证书。我还可以通过https向浏览器上的api请求。 我可以通过关闭验证来解决此问题。此代码有效。 问题是,这不验证SSL证书,因此打开了安全漏洞。 如何配置axios以信任证书并正确验证它? 问题答案

  • 我使用的是spring数据Cassandra项目V1.3.0无法为我的Cassandra集群(V2.0.17)配置SSL。Sprint Data Cassandra文档表示,它支持使用DataStax Java驱动程序(2.0.x)的Cassandra 2.x,因此应该不会有问题。下面是初始化cassandra集群bean的Java cassandra配置: 我已经验证了用于设置SSL上下文的环境

  • 那么... 我在端口8080的服务器上运行了一个节点应用程序,我正在尝试使用NGINX和CloudFlare使其能够通过SSL工作。请注意以下几点。。。 我的主机正在运行Ubuntu 16.04 LTS ...我以前的NGINX配置看起来像。。。 ...现在看起来。。。 ...我遵循了这里的例子和它在这里提供的链接,我怀疑上面的一切都是必需的(我是一个极简主义者)。每当我运行时,我仍然会在未指定s