OpenSSL的安装及在Java语言的工程中的使用

OpenSSL的安装

1. OpenSSL源码下载

OpenSSL的下载链接,点击可以进入相应的下载页面 OpenSSL的Downloads

OpenSSL官网没有提供windows版本的安装包,可以选择第三方提供的安装包,也可以自己下载源码进行编译安装,第三方的下载链接为: Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com)

进入官方的下载页面后可以看到如下:

alt

OpenSSL的3.0版本和1.1.x版本的区别:

  • OpenSSL 3.0是 OpenSSL 的最新主要版本;
  • 1.1.x 系列是OpenSSL的长期支持(LTS)版本,支持到2023年9月11日。

我们下载3.0版本的源码,然后自己编译完成安装。

我将源码放置到目录:C:\openssl\openssl-3.0.3

alt

2. Perl安装

编译OpenSSL需要安装Perl环境,如何安装Perl可以看一下菜鸟教程的: Perl 环境安装 |菜鸟教程 (runoob.com)

进入 Perl Download - www.perl.org,选择 strawberry-perl下载。

无脑点击下一步,然后cmd输入perl -v,能看到如下画面,说明已经成功啦!

alt

3.编译安装OpenSSL

少装以下两个库,可能会导致nmake失败。

# 安装这两个库
perl -MCPAN -e "install Test::More" 
perl -MCPAN -e "install Text::Template"

需要先下载Visual Studio,本人安装的是Visual Studio 2022社区版。

安装完Visual Studio之后,点击“视窗图标”,然后选择“visual studio command prompt”。

alt

执行以下命令行:

cd C:\openssl\openssl-3.0.3
perl Configure debug-VC-WIN64A no-shared no-tests no-asm --prefix="C:\opensslbin"
nmake
nmake install

nmake结束时的截图:

alt

nmake install结束时的截图:

1653498680336

进入:C:\opensslbin可以看到如下图,说明安装基本已经成功。

alt

cmd中执行如下命令:

cd C:\opensslbin\bin
openssl -help

alt

如果看到上图的输出,则说明openssl安装已经成功。

OpenSSL在Java工程中的使用

OpenSSL使用C/C++进行编写,因此效率很高。但是如果做上层的工程应用,Java编程语言则更加擅长。

JNI是一种在Java中使用C/C++的过程或者函数的Java接口。

Java通过JNI和C/C++语言编译出来的dll的交互示意图,具体可以看 详解JNI到底是什么_java_脚本之家 (jb51.net)

alt

第一步,新建一个Java项目,名字叫做SimpleHello,包名叫做com.study.jni.demo.simple,新建一个SimpleHello的类,然后里面的代码为:

package com.study.jni.demo.simple;

public class SimpleHello {
    public static native String sayHello(String name);

    public static void main(String[] args) {
        String name = "wkm";
        String text = sayHello(name) + "";
        System.out.println("after native, java shows:" + text);
    }

    static {
        // hello.dll要放在系统路径下,比如C:\windows\
        System.loadLibrary("hello");
    }
}

第二步,打开SimpleHello.java所在的目录,然后文件目录栏上输入cmd回车,输入以下命令:

# 注意最后有一个“点”
javac SimpleHello.java -h .
1653530213289

此时可以看到,当前目录下会生成两个文件:

  1. SimpleHello.class
  2. com_study_jni_demo_simple_SimpleHello.h

第三步,在VS2022里创建一个dll工程,名字叫做hello,并将文件com_study_jni_demo_simple_SimpleHello.h复制粘贴放置到该工程目录下,也就是和其它.cpp和.h文件相同的目录。

alt

然后,项目中头文件->右键->添加->现有项,选择刚才的那个com_study_jni_demo_simple_SimpleHello.h文件。

第四步,在hello.cpp文件中输入如下代码:

#include <jni.h>
#include <stdio.h>
#include "string.h"
#include "com_study_jni_demo_simple_SimpleHello.h"

JNIEXPORT jstring JNICALL Java_com_study_jni_demo_simple_SimpleHello_sayHello(JNIEnv* env, jclass cls, jstring j_str)
{
    const char* c_str = NULL;
    char buff[128] = { 0 };
    jboolean isCopy;
    c_str = env->GetStringUTFChars(j_str, &isCopy);
    if (c_str == NULL) {
        printf("out of memory.\n");
        return NULL;
    }

    printf("From Java String:addr: %x string: %s len: %d isCopy: %d\n",
        c_str, c_str, strlen(c_str), isCopy);
    sprintf_s(buff, "hello %s", c_str);
    env->ReleaseStringUTFChars(j_str, c_str);
    printf("Hello world!/n");
    return env->NewStringUTF(buff);
}

此时,#include <jni.h>会报红,这是因为没有引入jni的库,这个库安装jdk时就有,把相关目录引入进行就行。

具体步骤是,在hello项目上点右键->属性->C/C++->常规->附加包含目录。

alt

然后输入以下两个:

%JAVA_HOME%\include\win32
%JAVA_HOME%\include

点确定然后点应用,可以发现#include <jni.h>不报红。

第五步,在hello项目点击右键,点击生成,此时在项目的文件目录hello\x64\Debug下可以找到一个名叫hello.dll的文件。将其复制粘贴到C:\Windows目录下。

alt

第六步,此时回到Java项目,运行该项目,可以看到如下输出,则说明运行成功。

alt