2018年5月

JxBrowser的初步使用和证书

因为在做广告系统的时候,很多来自第三方的广告链接很多时候跳转并不成功,这个时候需要需要在服务端筛选这些链接,同时尽可能模拟客户端的webview(webkit),所以选择了JxBrowser.(jxbrowser-6.20)
下面是按照使用步骤(官方教程:https://jxbrowser.support.teamdev.com/support/solutions/articles/9000012865-quick-start-guide-for-javafx-developers)
一、下载依赖包http://www.teamdev.com/jxbrowser
在windows需要jxbrowser.jar和jxbrowser-win32.jar
二、得到许可
https://www.teamdev.com/jxbrowser#evaluate填写信息,在邮件里面得到一个30天的许可
三、代码
完整的包结构为:
aaaa.png

package fx;

import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserCore;
import com.teamdev.jxbrowser.chromium.internal.Environment;
import com.teamdev.jxbrowser.chromium.javafx.BrowserView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * The sample demonstrates how to create Browser instance, embed it,
 * load HTML content from string, and display it.
 */
public class HelloWorld extends Application {
    @Override
    public void init() throws Exception {
        // On Mac OS X Chromium engine must be initialized in non-UI thread.
        if (Environment.isMac()) {
            BrowserCore.initialize();
        }
    }

    @Override
    public void start(Stage primaryStage) {
        Browser browser = new Browser();
        BrowserView browserView = new BrowserView(browser);

        StackPane pane = new StackPane();
        pane.getChildren().add(browserView);
        Scene scene = new Scene(pane, 500, 400);
        primaryStage.setTitle("JxBrowser: JavaFX - Hello World");
        primaryStage.setScene(scene);
        primaryStage.show();

        browser.loadHTML("<html><body><h1>Hello World CIIKA!</h1></body></html>");
    }

    public static void main(String[] args) {
        launch(args);
    }
}

四、破解许可证
在下载的包里面有个demo,里面有一个,demo\META-INF\teamdev.licenses,把这个解压出来,替换到上面的临时证书里面的META-INF\teamdev.licenses即可。
首先把teamdev.licenses的内容替换为:

Product: JxBrowser
Version: 6.x
Licensed to: 
License type: Evaluation
License info: Single-user license
Expiration date: 13-08-2088
Support expiration date: 13-08-2088
Generation date: 14-07-2018
Platforms: win32/x86;mac/x86;linux/x86;linux/x64;mac/x64;mac/ppc;win32/x64
Company name: NO COMPANY
SigB: 1
SigA: 1

然后放入到license.jar,重新加入到classpath里面去
在入口里面加入:

static {
        try {
            Field e = ay.class.getDeclaredField("e");
            e.setAccessible(true);
            Field f = ay.class.getDeclaredField("f");
            f.setAccessible(true);
            Field modifersField = Field.class.getDeclaredField("modifiers");
            modifersField.setAccessible(true);
            modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL);
            modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            e.set(null, new BigInteger("1"));
            f.set(null, new BigInteger("1"));
            modifersField.setAccessible(false);
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    }

注意import com.teamdev.jxbrowser.chromium.ay;
启动后确实是破解了
以上方法在6.16里面测试通过,6.21,6.20的版本里面ay的这个类发生了变化,无法通过这个方法破解,建议换成az.class试试看。
还有个方式比较笨,但是有效,就是跳转系统时间,调整为任何一个在你试用证书有效期内的时间均可。
以上破解方式仅限学习使用,如果公司确实赚钱,建议还是购买版权。

问题:Access restriction: The type 'Application' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jfxrt.jar')
由于JDK里面没有javafx的扩展,我选择下了一个带完整SDK的eclipse,http://downloads.efxclipse.org/eclipse.org/sdks/releases/2.4.0/

nginx使用godaddy的ssl证书

以下均采用ciika.com作为例子

---------在linux服务器上操作---------
1:生成key(确保机器上安装了openssl)

openssl genrsa -out ciika.com.key 2048

( SHA-2 和 2048 位加密)
2:生成csr文件(godaddy需要用)

openssl req -new -key ciika.com.key -out ciika.com.csr

---------在godaddy上操作---------
3:上传csr
复制第2步里面生成的csr(ciika.com.csr),粘贴到输入框
4:等待审核结果
证书.png
5:审核通过后下载证书zip文件
里边包含61925e49dabae55a.crt和gd_bundle-g2-g1.crt
downcrt.png

---------在linux服务器上操作---------
6:生成crt文件

cat 61925e49dabae55a.crt gd_bundle-g2-g1.crt > ciika.com.crt

7:更改nginx配置
核心配置为

listen 443;
ssl on;
ssl_certificate ciika.com.crt;
ssl_certificate_key ciika.com.key;

重启后即可访问

测试tls的支持情况
Verify that TLS v1.2 is supported: openssl s_client -tls1_2 -connect ciika.com:443 < /dev/null
Verify that TLS v1.1 is not supported: openssl s_client -tls1_1 -connect ciika.com:443 < /dev/null
Verify that TLS v1.0 is not supported: openssl s_client -tls1 -connect ciika.com:443 < /dev/null

如果nginx重启每次都需要密码,可以重新生成一个key并且使用
openssl rsa -in ciika.key -out ciika.key.unsecure

在nginx里面把实际使用的tls协议打印出来看看

log_format combined_ssl '$remote_addr - $remote_user [$time_local] '
                        '$ssl_protocol/$ssl_cipher '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';

参考:
https://blog.myssl.com/ssl-and-tls-deployment-best-practices/
https://askubuntu.com/questions/319192/how-to-enable-tls-1-2-in-nginx
https://serverfault.com/questions/671983/how-to-disable-tlsv1-0-and-tlsv1-1-in-nginx
http://www.wxapp-union.com/article-1085-1.html