使用代理进行Betamax HTTPS录制 - 证书错误 - Java Groovy

时间:2016-09-03 16:59:08

标签: groovy spock betamax

我无法让HTTPS URL与betamax一起使用。

它类似于下面发布的其他问题,但是我已经完成了betamax.pem文件导入,它似乎没有效果:

这是我运行的导入命令:

c:\Users\UserAccount>"%JAVA_HOME%/bin/keytool.exe" -importcert -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file betamax.pem -alias betamax -storepass changeit -noprompt

这是我的配置:

    static final File TAPES =
    new File(System.getProperty('BETAMAX_TAPEDIR') ?:
        'src/integrationTest/resources/betamax/tapes')

    static final TapeMode TAPEMODE =
    System.getProperty('BETAMAX_MAKETAPES') ?
        TapeMode.READ_WRITE :
        TapeMode.READ_ONLY

    static final Integer PROXYPORT =
    System.getProperty('BETAMAX_PROXYPORT') ?
        System.getProperty('BETAMAX_PROXYPORT').toInteger() :
        Configuration.DEFAULT_PROXY_PORT

    @Shared
    Configuration configuration =  Configuration.builder()
            .tapeRoot(TAPES)
            .ignoreLocalhost(false)
            .defaultMode(TAPEMODE)
            .proxyPort(PROXYPORT)
            .sslEnabled(true)
            .build()

    @Rule
    RecorderRule recorder = new RecorderRule(configuration)

    @Betamax(tape='GradleNews.tape')
    def "Try record HTTPS"()
    {
      when:
      def http = new RESTClient('https://discuss.gradle.org')
      http.head path: 'c/books-articles'

      then:
      true
    }

产生:

javax.net.ssl.SSLException: hostname in certificate didn't match: <discuss.gradle.org> != <*.discourse.org> OR <*.discourse.org> OR <discourse.org>

谁能看到我做错了什么?

以下是类似问题的报告: Betamax fails to record HTTPS traffic

1 个答案:

答案 0 :(得分:0)

总之,答案是HTTPBuilder不尊重Betamax实现的自动重定向代理。这是在betamax.software文档中记录的,我似乎误解了它。要使用HTTPBuilder(或它的RESTClient衍生产品),只需将httpclient上的代理主机/端口分别手动设置为127.0.0.1/5555。当使用尊重JVM代理设置的HTTP客户端时,它似乎无缝地工作。

还值得注意的是,错误消息非常具有误导性。使用RESTClient时,它似乎指向证书中的一个问题,这使我花了一天时间试图弄清楚为什么它没有在证书库中看到betamax证书。但是,证书没有问题,它纯粹是通过手动设置代理来修复的。