如何用Java读取使用证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Java读取使用证书相关的知识,希望对你有一定的参考价值。

证书(Certificate,也称public-key certificate)是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的、可以用来当成信任关系中介的数字凭证。证书发行机构通过发行证书告知证书使用者或实体其公钥(public-key)以及其它一些辅助信息。证书在电子商务安全交易中有着广泛的应用,证书发行机构也称CA(Certificate Authority)。

应用证书

证书在公钥加密应用中的作用是保证公钥在某些可信的机构发布,其在协议SSL、电子交易协议SET等方面有重要的应用。图1显示了一个最简单的证书应用方法:

图1 证书应用方法

证书的应用步骤是:

(1) A把自己的公钥PKA送到CA(Certificate Authority);

(2) CA用自己的私钥和A的公钥生成A的证书,证书内包括CA的数字签名。签名对象包括需要在证书中说明的内容,比如A的公钥、时间戳、序列号等,为了简化这里不妨假设证书中只有三项内容:A的公钥PKA、时间戳TIME1、序列号IDA。那么CA发送给A的简单证书凭证可表达为:CertA=Eca[TIME1,IDA,PKA];

(3) B同样把自己的公钥PKB送到CA;

(4) B得到CA发布的证书CertB;

(5) A告知B证书CertA;

(6) B告知A证书CertB。

A、B各自得到对方证书后,利用从CA得到的公钥(在CA的自签证书中)验证彼此对方的证书是否有效,如果有效,那么就得到了彼此的公钥。利用对方的公钥,可以加密数据,也可以用来验证对方的数字签名。

本文为了方便说明,并没有使用从CA获得的证书,而是通信双方各自产生自签证书,也就是说图1的A和B并没有经过CA,不过前提是A和B之间是互相拥有对方的证书。
参考技术A

Java为安全应用提供了丰富的API,J2SDK1.4 的JSSE (JavaTM Secure Socket Extension) 包括javax.security.certificate包,并且提供对证书的操作方法,代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.io.*;
public class CARead extends JPanel 
 private String CA_Name; 
 private String CA_ItemData[][] = new String[9][2];
 private String[] columnNames = "证书字段标记","内容" ;
 public CARead(String CertName) 
  CA_Name=CertName;
  /* 三个Panel用来显示证书内容*/
  JTabbedPane tabbedPane = new JTabbedPane();
  JPanel panelNormal = new JPanel();
  tabbedPane.addTab("普通信息", panelNormal);   
  JPanel panelAll=new JPanel();
  panelAll.setLayout(new BorderLayout());
  tabbedPane.addTab("所有信息",panelAll);
  JPanel panelBase64=new JPanel();
  panelBase64.setLayout(new BorderLayout());
  tabbedPane.addTab("Base64编码信息",panelBase64);
  /* 读取证书常规信息 */
  Read_Normal(panelNormal);
  /* 读取证书文件字符串表示内容 */
  Read_Bin(panelAll);
  /* 读取证原始Base64编码形式的证书文件 */
  Read_Raw(panelBase64);
  tabbedPane.setSelectedIndex(0);
  setLayout(new GridLayout(1, 1)); 
  add(tabbedPane);
 

定义证书信息的读取函数如下:

private int Read_Normal(JPanel panel)
 String Field;
 try
  CertificateFactory certificate_factory=CertificateFactory.getInstance("X.509");
  FileInputStream file_inputstream=new FileInputStream(CA_Name);
  X509Certificate 
x509certificate=(X509Certificate)certificate_factory.generateCertificate
(file_inputstream);
  Field=x509certificate.getType();
  CA_ItemData[0][0]="类型";
  CA_ItemData[0][1]=Field;
  Field=Integer.toString(x509certificate.getVersion());
  CA_ItemData[1][0]="版本";
  CA_ItemData[1][1]=Field;
  Field=x509certificate.getSubjectDN().getName();
  CA_ItemData[2][0]="标题";
  CA_ItemData[2][1]=Field;
  /* 以下类似,这里省略 
  Field=x509certificate.getNotBefore().toString();得到开始有效日期
  Field=x509certificate. getNotAfter().toString();得到截止日期
  Field=x509certificate.getSerialNumber().toString(16);得到序列号
  Field=x509certificate.getIssuerDN().getName();得到发行者名
  Field=x509certificate.getSigAlgName();得到签名算法
  Field=x509certificate.getPublicKey().getAlgorithm();得到公钥算法 */
  file_inputstream.close();
  final JTable table = new JTable(CA_ItemData, columnNames);
  TableColumn tc=null;
  tc = table.getColumnModel().getColumn(1);
  tc.setPreferredWidth(600); 
  panel.add(table);
 catch(Exception exception)
  exception.printStackTrace();
  return -1;
 
 return 0;

如何用java读取pdf文档的部分内容

参考技术A

你需要用到PDFbox api

https://pdfbox.apache.org/1.8/cookbook/textextraction.html

例子如下

import java.io.File; 
import java.io.IOException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;

try 
    PDDocument document = null;
    document = PDDocument.load(new File("test.pdf"));
    document.getClass();
    if (!document.isEncrypted()) 
        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
        stripper.setSortByPosition(true);
        PDFTextStripper Tstripper = new PDFTextStripper();
        String st = Tstripper.getText(document);
        System.out.println("Text:" + st);
    
 catch (Exception e) 
    e.printStackTrace();

本回答被提问者采纳

以上是关于如何用Java读取使用证书的主要内容,如果未能解决你的问题,请参考以下文章

如何用java读取pdf文档的部分内容

如何用java读取excel文件

如何用java读取excel中的数据?下面的例子不能读出自己写的excel数据

如何用JAVA NIO读取文件的指定内容?

Docker 容器 如何用java读取宿主机里的文件?

如何用java读取ASCII码STL文件