openssl签名配置tomcat7单双向SSL

本文详细介绍了在Windows环境下安装配置OpenSSL的过程,以及如何使用OpenSSL生成自签名证书、服务器证书和客户端证书,并在Tomcat 7中进行SSL配置与测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows 下OpenSSL 安装详解 +图解

 

安装环境:

     1、操作系统:Windows XP SP2

      2C++编译器:VC++ 6.0

下载:

  • 下载ActivePerl  5.10.1.1007(最新的版本或较低的版本也可以):

下载地址:http://www.activestate.com/activeperl/downloads/

(当前的最新版本为ActivePerl 5.10.1.1007 ,只要按照Windows下一般程序的安装步骤进行即可~~~在此就不赘述了)

  • 下载 openssl-0.9.8m(当然也可以最新的版本)并解压。

下载地址: http://www.openssl.org/source/

PerlOpenSSL的安装:

   安装Perl

(我的安装目录为C:\perl\eg)

运行“CMD”命令,使用cd命令指向perl安装目录的eg文件,执行“perl example.pl”若显示“Hello from ActivePerl!”,则说明Perl安装成功,可以开始使用Perl的相关命令来进行OpenSSL的安装了,如下图:

 

Note:如果你想看看原始的INSTALL文件,那么请打开OpenSSL的解压缩目录,下面有两个文件INSTALL.W32和INSTALL.W64,用记事本方式打开,你可以看到详细的关于安装的解释~~~~

开始安装OpenSSL

  • 初始化VC++ 6.0 环境变量(找到vc++ 6.0的安装目录下的\VC98\Bin\执行如下的命令):

  • 执行Configure命令(配置编译参数):

  • 运行ms\do_ms命令(在使用Configure脚本配置好参数):

另外两种方式 如果使用也必须保证本机安装有相应的编译器才能使用。
     :ms\do_masm
(默认vc自带的;也可以自己下载masm并安装)   
     :ms\do_nasm (需要下载nasm)

 

  • 运行“nmake -f ms\ntdll.mak”命令进行代码编译(需将目录跳到OpenSSL目录下)

如果编译成功,最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib ;把他们放到PATH环境变量对应的一个目录里就可以了。

 

  • 测试使用命令“nmake -f ms\ntdll.mak test”

若安装成功的话,显示的最后几行如下图:

 

  • 配置VC++ 6.0下的相关参数

VC++ 6.0的工具》选项》目录下的Include files下添加OpenSSL安装目录下的include目录;在Library files下添加out32dll目录,现在你就可以使用OpenSSL编程了~~~

 



使用openssl签名证书并在tomcat7中进行配置

 

1 准备
首先,在进行证书签名前准备一些软件,并配置一些环境。包括:
1.1 下载安装openssl
1.2 确定服务器及客户端用户名
这里规划如下:
机器                           机器名                             备注
部署应用服务器的服务器 server.neuqdomain                最好采用:名称 + “.域名”格式
客户端用户              任意                             任意格式
ca根证书                           无                             不同于服务器名的任意名称

这里比较重要的一点是:需要在服务器和测试的客户端中配置该服务器的DNS名称为

server.neuqdomain。在windows下测试时,我们可以直接修改%windir%\system32

\drivers\etc\hosts 文件。在该文件中添加:
127.0.0.1 server.neuqdomain
即可。
1.3 根证书信息规划
检查是否有根证书,如果没有先确定根证书的名称
这里规划根证书为:neuqca
完整信息为:
国家:CN,省:heb,市:qhd,单位性质:com,单位名:neuqsoft
用户名:  neuqrootca    密码:
1.4 服务器端证书规划
这里规划根证书为:server (注意:此服务器端证书用户名必须和服务器机器名一致)
完整信息为:
国家:CN,省:heb,市:qhd,单位性质:com,单位名:neuqsoft
用户名:  server.neuqdomain    密码:
1.5 客户器端证书规划
这里规划根证书为:client (此处客户端用户名可以任意指定)
完整信息为:
国家:CN,省:heb,市:qhd,单位性质:com,单位名:neuqsoft
用户名:  client    密码:
1.6 规划一下保存放置证书的目录
这里产生的证书放到测试用的tomcat中的 %TOMCAT_HOME%\conf\ssl中(实际任意目录均可

,建议统一规划),再在该目录下划分为:ca,server,client,jks几个目录
配置openssl的环境变量
将%openssl_home%\bin目录添加到path的环境变量中,确保能在命令行中执行openssl命令。

执行正确会出现 openssl>提示符。出现提示符后quit即可。
1.7 文件后缀名规划
产生证书过程中会用到的文件后缀规划如下:
后缀名 格式 备注
-key.pem pem pem文件一般是文本格式的,可以放证书或者私钥。这里用来放key文件
-req.csr csr 证书请求文件
-cert.cer cer 公钥证书
.p12 p12 个人证书格式PKCS12
.keystore jks jks证书存储库,注意linux下最好使用keystore后缀名
.srl srl CA序列号文件
证书key文件,未签名的证书文件
2 证书生成配置
2.1 创建根证书,并用openssl自签名
此工程产生的证书可复用。应当每次使用一个相同的根证书,不要重新生成。
1. 生成ca根证书key
openssl genrsa -out ca/root-key.pem 1024
2.创建根证书请求文件
openssl req -new -out ca/root-req.csr -key ca/root-key.pem
#openssl req -new -out ca/root-req.csr -key ca/root-key.pem -keyform PEM
3.自签根证书
openssl x509 -req -in ca/root-req.csr -out ca/root-cert.cer -signkey ca/root-key.pem -

CAcreateserial -days 3650
4.导出p12格式根证书
openssl pkcs12 -export -clcerts -in ca/root-cert.cer -inkey ca/root-key.pem -out ca/root.p12
5.生成root.jks文件
keytool -import -v -trustcacerts -storepass 222222 -alias neuqrootca -file ca/root-cert.cer -

keystore jks/root.keystore
输出截屏信息为:
------------------------产生自签名根证书部分--------------------------------
D:\appserver\tomcat-7.0.37\conf\ssl>openssl genrsa -out ca/root-key.pem 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.......++++++
...........++++++
e is 65537 (0x10001)

D:\appserver\tomcat-7.0.37\conf\ssl>openssl req -new -out ca/root-req.csr -key c
a/root-key.pem
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:heb
Locality Name (eg, city) []:qhd
Organization Name (eg, company) [Internet Widgits Pty Ltd]:com
Organizational Unit Name (eg, section) []:neuqsoft
Common Name (e.g. server FQDN or YOUR name) []:neuqrootca
Email Address []:neuqrootca@neuqsoft.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:

D:\appserver\tomcat-7.0.37\conf\ssl>openssl x509 -req -in ca/root-req.csr -out c
a/root-cert.cer -signkey ca/root-key.pem -CAcreateserial -days 3650
Loading 'screen' into random state - done
Signature ok
subject=/C=CN/ST=heb/L=qhd/O=com/OU=neuqsoft/CN=neuqrootca/emailAddress=neuqro

ot
ca@neuqsoft.com
Getting Private key

D:\appserver\tomcat-7.0.37\conf\ssl>openssl pkcs12 -export -clcerts -in ca/root-
cert.cer -inkey ca/root-key.pem -out ca/root.p12
Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:

D:\appserver\tomcat-7.0.37\conf\ssl>keytool -import -v -trustcacerts -storepass
222222 -alias neuqrootca -file ca/root-cert.cer -keystore jks/root.jks
所有者:EMAILADDRESS=neuqrootca@neuqsoft.com, CN=neuqrootca, OU=neuqsoft, O=com,
L=qhd, ST=heb, C=CN
签发人:EMAILADDRESS=neuqrootca@neuqsoft.com, CN=neuqrootca, OU=neuqsoft, O=com,
L=qhd, ST=heb, C=CN
序列号:e6d18bc29dc3513e
有效期: Fri Apr 05 10:11:00 CST 2013 至Mon Apr 03 10:11:00 CST 2023
证书指纹:
         MD5:99:14:5B:63:F2:79:ED:B6:A6:FD:21:1E:20:ED:06:4F
         SHA1:9F:1D:AE:13:EE:98:4F:C0:19:70:38:A4:37:28:4B:31:D4:63:60:4C
         签名算法名称:SHA1withRSA
         版本: 1
信任这个认证? [否]:  是
认证已添加至keystore中
[正在存储 jks/root.jks]
2.2 产生根证书签名的服务器端证书部分
此过程应当针对具体的服务器进行证书签发。不同的服务器应当使用不同的证书。
1.生成服务端key
openssl genrsa -out server/server-key.pem 1024
2.生成服务端请求文件
openssl req -new -out server/server-req.csr -key server/server-key.pem
3.生成服务端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in server/server-req.csr -out server/server-cert.cer -signkey

server/server-key.pem -CA ca/root-cert.cer -CAkey ca/root-key.pem -CAcreateserial -days

3650
4.生成服务端p12格式根证书
openssl pkcs12 -export -clcerts -in server/server-cert.cer -inkey server/server-key.pem -out

server/server.p12
查看证书信息
使用以下命令可以检查生成的证书信息
keytool -list -keystore server/server.p12 -storetype pkcs12 -v -storepass 123456
导出服务端证书到JKS
keytool -import -v -trustcacerts -storepass 123456 -alias neuqserver -file server/server-

cert.cer -keystore jks/server.keystore
输出截屏信息为:
D:\appserver\tomcat-7.0.37\conf\ssl>openssl genrsa -out server/server-key.pem 10
24
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.......................++++++
.............................++++++
e is 65537 (0x10001)

D:\appserver\tomcat-7.0.37\conf\ssl>openssl req -new -out server/server-req.csr
-key server/server-key.pem
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:heb
Locality Name (eg, city) []:qhd
Organization Name (eg, company) [Internet Widgits Pty Ltd]:com
Organizational Unit Name (eg, section) []:neuqsoft
Common Name (e.g. server FQDN or YOUR name) []:server.neuqdomain
Email Address []:server@neuqsoft.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

D:\appserver\tomcat-7.0.37\conf\ssl>openssl x509 -req -in server/server-req.csr
-out server/server-cert.cer -signkey server/server-key.pem -CA ca/root-cert.cer
-CAkey ca/root-key.pem -CAcreateserial -days 3650
Loading 'screen' into random state - done
Signature ok
subject=/C=CN/ST=heb/L=qhd/O=com/OU=neuqsoft/CN=server.neuqdomain/emailAddress

=s
erver@neuqsoft.com
Getting Private key
Getting CA Private Key

D:\appserver\tomcat-7.0.37\conf\ssl>openssl pkcs12 -export -clcerts -in server/s
erver-cert.cer -inkey server/server-key.pem -out server/server.p12
Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:

D:\appserver\tomcat-7.0.37\conf\ssl>keytool -import -v -trustcacerts -storepass
123456 -alias neuqserver -file server/server-cert.cer -keystore jks/server.jks
所有者:EMAILADDRESS=server@neuqsoft.com, CN=server.neuqdomain, OU=neuqsoft,

O=co
m, L=qhd, ST=heb, C=CN
签发人:EMAILADDRESS=neuqrootca@neuqsoft.com, CN=neuqrootca, OU=neuqsoft, O=com,
L=qhd, ST=heb, C=CN
序列号:bbd911d011910725
有效期: Fri Apr 05 10:21:31 CST 2013 至Mon Apr 03 10:21:31 CST 2023
证书指纹:
         MD5:A7:CD:0C:16:00:A2:A3:77:4C:45:15:30:B1:2F:84:B0
         SHA1:1A:C4:49:77:0C:1C:9F:E5:FC:3E:33:37:6F:A4:27:41:A7:08:15:E7
         签名算法名称:SHA1withRSA
         版本: 1
信任这个认证? [否]:  是
认证已添加至keystore中
[正在存储 jks/server.jks]
2.3 产生根证书签名的客户端证书部分
需要双喜认证时使用。此时需要为每个客户端分发客户端证书。根据实际业务,可以各客户端

使用同一个客户端证书,也可以各客户端使用不同的证书。
1.生成客户端key
openssl genrsa -out client/client-key.pem 1024
2.生成客户端请求文件
openssl req -new -out client/client-req.csr -key client/client-key.pem
3.生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in client/client-req.csr -out client/client-cert.cer -signkey client/client-

key.pem -CA ca/root-cert.cer -CAkey ca/root-key.pem -CAcreateserial -days 3650
4.生成客户端p12格式根证书
openssl pkcs12 -export -clcerts -in client/client-cert.cer -inkey client/client-key.pem -out

client/client.p12
查看证书信息
使用以下命令可以检查生成的证书信息
keytool -list -keystore client/client.p12 -storetype pkcs12 -v -storepass 123456
导出客户端证书到jks:
keytool -import -v -trustcacerts -storepass 123456 -alias neuqclient -file client/client-cert.cer

-keystore jks/client.keystore
输出截屏信息为:
D:\appserver\tomcat-7.0.37\conf\ssl>openssl genrsa -out client/client-key.pem 10
24
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
......++++++
.......++++++
e is 65537 (0x10001)

D:\appserver\tomcat-7.0.37\conf\ssl>openssl req -new -out client/client-req.csr
-key client/client-key.pem
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:heb
Locality Name (eg, city) []:qhd
Organization Name (eg, company) [Internet Widgits Pty Ltd]:com
Organizational Unit Name (eg, section) []:neuqsoft
Common Name (e.g. server FQDN or YOUR name) []:client
Email Address []:client@neuqsoft.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

D:\appserver\tomcat-7.0.37\conf\ssl>openssl x509 -req -in client/client-req.csr
-out client/client-cert.cer -signkey client/client-key.pem -CA ca/root-cert.cer
-CAkey ca/root-key.pem -CAcreateserial -days 3650
Loading 'screen' into random state - done
Signature ok
subject=/C=CN/ST=heb/L=qhd/O=com/OU=neuqsoft/CN=client/emailAddress=client@neuqs
oft.com
Getting Private key
Getting CA Private Key

D:\appserver\tomcat-7.0.37\conf\ssl>openssl pkcs12 -export -clcerts -in client/c
lient-cert.cer -inkey client/client-key.pem -out client/client.p12
Loading 'screen' into random state - done
Enter Export Password:
Verifying - Enter Export Password:

D:\appserver\tomcat-7.0.37\conf\ssl>keytool -import -v -trustcacerts -storepass
123456 -alias neuqclient -file client/client-cert.cer -keystore jks/client.jks
所有者:EMAILADDRESS=client@neuqsoft.com, CN=client, OU=neuqsoft, O=com, L=qhd, S
T=heb, C=CN
签发人:EMAILADDRESS=neuqrootca@neuqsoft.com, CN=neuqrootca, OU=neuqsoft, O=com,
L=qhd, ST=heb, C=CN
序列号:bbd911d011910726
有效期: Fri Apr 05 10:24:10 CST 2013 至Mon Apr 03 10:24:10 CST 2023
证书指纹:
         MD5:B4:72:08:85:0E:9D:FA:3A:81:62:20:6E:D1:3E:75:C2
         SHA1:88:E4:19:35:EA:8A:A1:08:40:02:4D:23:35:1B:58:5B:56:2C:1C:3B
         签名算法名称:SHA1withRSA
         版本: 1
信任这个认证? [否]:  是
认证已添加至keystore中
[正在存储 jks/client.jks]
3 Tomcat中的配置
3.1 将ca根证书和客户端证书导入keystore
命令:
keytool -import -v -trustcacerts -storepass 222222 -alias neuqrootca -file ca/root-cert.cer -

keystore jks/trust.keystore
keytool -import -v -trustcacerts -storepass 222222 -alias neuqclient -file client/client-cert.cer

-keystore jks/trust.keystore
说明:
这里产生的jks为一个新的jks,也可以直接使用默认的jks,默认的jks位置位于启动tomcat时使

用的JAVA_HOME下,位置为
%JAVA_HOME%/jre/lib/security/cacerts   默认密码为changeit
双向ssl认证时,需要在该信任库中保护根证书及允许访问的客户端证书(无需包含服务器端证

书)。

3.2 在客户端浏览器中导入根证书
注意应当导入到受信任的根证书颁发机构中。
3.3 在客户端浏览器中导入根证书签名的客户端证书
3.4 修改context.xml中配置
1.一般情况下,没有使用APR时,直接屏蔽掉APR连接器。APR连接默认要求SSL连接
2.对于http连接器(包括NIO连接),修改其中SSL配置,并取消SSL的注释。此时为:JSSE方

式)
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
   clientAuth="true" sslProtocol="TLS"
   keystoreFile="conf/ssl/server/server.p12 " keystorePass="123456"

keystoreType="PKCS12"
   truststoreFile="conf/ssl/jks/trust.keystore " truststorePass="222222"

truststoreType="JKS"
   SSLCertificateFile="D:/appservertomcat-7.0.37/conf/ssl/server/server-cert.cer"
   SSLCertificateKeyFile="D:/appservertomcat-7.0.37/conf/ssl/server/server-key.pem" /> 
说明:在Linux中,可能会使用truststoreFile配置自定义的信任库不能正常使用的情况。会提示

找不带对应得keystore文件(如这里而定trust.jks)。此时默认位置在 ~/下。
4 Tomcat中SSL测试
4.1 单向SSL测试
此时,tomcat中ssl配置中的clientAuth="false"。这里以使用的服务器端证书为

server.neuqdomain为例。
在浏览器中输入:  https://server.neuqdomain:8443/ 进行访问
根据浏览器设置可能会直接接受服务器端证书访问,也可能会给出证书提示后正确访问到。此

时浏览器不应该有报错(前提是证书正确,配置无误,且证书用户名和服务器机器名相同)
注意:如果证书中配置用户名为server.neuqdomain,而在服务器上使用https://localhost:8443/

进行访问时,浏览器会提示“证书错误是否继续”。出现此问题是应用,服务器端认证必须为相

应的服务器名进行访问才能正确认证,并非配置错误。
4.2 双向SSL测试
此时,tomcat中ssl配置中的clientAuth="true"。这里以使用的服务器端证书为

server.neuqdomain为例。
客户端通过浏览器访问:https://server.neuqdomain:8443/时,如果未在本机导入客户端证书

则不能访问,如果导入了客户端则可以正确访问。
4.3 客户端证书用户验证
双向SSL认证下,web应用可以通过客户端证书获取证书中的用户名,直接用来进行用户验证


这里以tomcat7及其自带的manager应用为例。
这里客户端证书信息为:
EMAILADDRESS=client@neuqsoft.com, CN=client, OU=neuqsoft, O=com, L=qhd, ST=heb,

C=CN
密码为null时。
在%tomcat_home%/conf/tomcat-users.xml中,添加:
<user username="EMAILADDRESS=client@neuqsoft.com, CN=client, OU=neuqsoft, O=com,

L=qhd, ST=heb, C=CN" password="null" roles="manager-gui,standard,manager-script"/>
及相应的角色(tomcat7中应为manager-gui;tomcat5、6中为manager,admin)后。再到

manager应用中修改web.xml。
将其中的:
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Tomcat Manager Application</realm-name>
  </login-config>
修改为:
  <login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>Tomcat Manager Application</realm-name>
  </login-config>
而后重启tomcat,则在访问: https://server.neuqdomain:8443/manager时可以直接访问到而

无需输入用户名及密码。此时tomcat实际是使用了客户端证书的用户名来进行相应的用户验证

及授权。
5 名词解释
5.1 SSL简介
Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据

加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。
5.2 TLS
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两

层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为

TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
5.3 CSR
CSR是Cerificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数

字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把

CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件

,也就是颁发给用户的证书。
通常CSR文件是在拿到参考码、授权码进行证书签发和下载时,通过网页提交给CA的(也可以

由浏览器自动生成)。
5.4 CER
用于存储公钥证书的文件格式。
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把

特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公

钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送

方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误

地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解

密.在公开密钥密码体制中,常用的一种是RSA体制。
5.5 PFX
公钥加密技术12号标准(Public Key Cryptography Standards #12,PKCS#12)为存储和传输

用户或服务器私钥、公钥和证书指定了一个可移植的格式。它是一种二进制格式,这些文件也

称为PFX文件。
5.6 PEM
增强型私人邮件(Privacy Enhanced Mail,PEM)格式现在更多地用作密钥格式,并且可以包

含私钥(RSA和DSA)、公钥(RSA和DSA)和x509证书。它存储ASCII头部包装 的Base64编码

DER格式的数据,所以它适用于系统之间的文本模式传输
5.7 DER
分布式编码规则(Distinguished Encoding Rules,DER)格式也可以包含私钥、公钥和证书。

它是大多数浏览器的默认格式,并且按照ASN1 DER格式进行存储。它没有头部——PEM是文本

头部包装的DER
5.8 JKS
Java密钥库(Java Key Store), JKS文件仅用于存储服务器证书、私钥、公钥和身份证书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值