服务器上的php javascript java小程序智能卡签名pdf
我正在制作一个php应用程序,其中我在服务器上生成了pdf文件,需要由2到60人使用智能卡(使用智能卡阅读器)进行数字签名 一个简单的按钮,上面写着 签名 然后,如果用户在reader应用程序中没有智能卡,则表示: 插入卡片 新弹出窗口包含: 输入引脚 所有这些都以: 文件签署了服务器上的php javascript java小程序智能卡签名pdf,java,php,javascript,Java,Php,Javascript,我正在制作一个php应用程序,其中我在服务器上生成了pdf文件,需要由2到60人使用智能卡(使用智能卡阅读器)进行数字签名 一个简单的按钮,上面写着 签名 然后,如果用户在reader应用程序中没有智能卡,则表示: 插入卡片 新弹出窗口包含: 输入引脚 所有这些都以: 文件签署了 这可以做到吗?如何做到?您需要一些在用户计算机上运行的东西,这些东西可以从它的常规沙盒中释放出来,比如一个签名的java小程序。有了这样的东西,一些javascript+AJAX和与服务器的来回通信,您当然可以做到您所
这可以做到吗?如何做到?您需要一些在用户计算机上运行的东西,这些东西可以从它的常规沙盒中释放出来,比如一个签名的java小程序。有了这样的东西,一些javascript+AJAX和与服务器的来回通信,您当然可以做到您所说的 您可能必须从用户的计算机上载该文件 e、 g 一、 身为比利时公民,也有一种智能卡类型的,可用于在网上签署文件或通过
这是否容易,现在这是另一个问题 我使用bouncy castle和itext libs完成了小程序。我遇到的问题主要是在我的小程序和libs上签名。这是通过在Eclipse中使用Ant解决的。小程序可以在。
package CompensateMeOnline 8;
导入com.itextpdf.text.DocumentException;
导入com.itextpdf.text.Rectangle;
导入com.itextpdf.text.pdf.*;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.security.*;
导入java.security.cert.CertificateException;
导入java.util.Enumeration;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.JOptionPane;
导入java.io.File;
导入java.lang.reflect.Method;
公共类CompenseMeOnlineApplet扩展了java.applet.applet{
私有静态最终长serialVersionUID=-5290769300644275624L;
字符串别名=新字符串();
@凌驾
公共void init(){
试一试{
试一试{
java.awt.EventQueue.invokeAndWait(new Runnable()){
@凌驾
公开募捐{
初始化组件();
}
});
}捕获(例外情况除外){
例如printStackTrace();
}
文件文件=新文件(“…”);
System.out.println(“您应该在哪里下载pdf:”
+getAbsolutePath());
密钥库KeyStore=null;
Provider pjacapi=Security.getProvider(“CAPI”);
最终提供程序pmscapi=Security.getProvider(“sunmsapi”);
System.out.println(“pmscapi:+pmscapi”);
如果(pmscapi!=null){
访问控制器
.doPrivileged(新的PrivilegedExceptionAction(){
@凌驾
public Boolean run()引发异常{
pmscapi.setProperty(“Signature.SHA1withRSA”,
“sun.security.mscapi.rsa1”);
返回true;
}
});
keyStore=keyStore.getInstance(“Windows我的”,pmscapi);
System.out.println(“keystore:+keystore”);
}else if(pjacapi!=null){
keyStore=keyStore.getInstance(“CAPI”);
}
如果(密钥库!=null){
load(null,null);
枚举枚举=keyStore.alias();
while(enums.hasMoreElements()){
this.jcombox1.addItem((字符串)enums.nextElement());
}
}
}捕获(IOEX异常){
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
级别(严重、空、ex);
}捕获(nosuchalgorithmex异常){
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
级别(严重、空、ex);
}捕获(证书例外){
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
级别(严重、空、ex);
}catch(KeyStoreException ex){
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
级别(严重、空、ex);
}捕获(例外情况除外){
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
级别(严重、空、ex);
}
}
/**
*从init()方法中调用此方法来初始化
*表单.警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
//
私有组件(){
jcombox1=newjavax.swing.JComboBox();
jButton1=newjavax.swing.JButton();
jButton2=newjavax.swing.JButton();
setCursor(新java.awt.Cursor(java.awt.Cursor.DEFAULT_Cursor));
setModel(新的javax.swing.DefaultComboxModel(
新字符串[]{“选择要用“}”签名的签名];
jButton1.setText(“符号”);
jButton1.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
jButton1ActionPerformed(evt);
}
});
jButton2.setText(“退出”);
jButton2.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
jButton2ActionPerformed(evt);
}
});
javax.swing.GroupLayout=newjavax.swing.GroupLayout(this);
这个.setLayout(布局);
布局。setHorizontalGroup(布局
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
package compensatemeonline8;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import java.io.File;
import java.lang.reflect.Method;
public class CompensateMeOnlineApplet extends java.applet.Applet {
private static final long serialVersionUID = -5290769300644275624L;
String alias = new String();
@Override
public void init() {
try {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
initComponents();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
File file = new File("..");
System.out.println("where the pdf you should :"
+ file.getAbsolutePath());
KeyStore keyStore = null;
Provider pjacapi = Security.getProvider("CAPI");
final Provider pmscapi = Security.getProvider("SunMSCAPI");
System.out.println("pmscapi:" + pmscapi);
if (pmscapi != null) {
AccessController
.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
@Override
public Boolean run() throws Exception {
pmscapi.setProperty("Signature.SHA1withRSA",
"sun.security.mscapi.RSASignature$SHA1");
return true;
}
});
keyStore = KeyStore.getInstance("Windows-MY", pmscapi);
System.out.println("keystore: " + keyStore);
} else if (pjacapi != null) {
keyStore = KeyStore.getInstance("CAPI");
}
if (keyStore != null) {
keyStore.load(null, null);
Enumeration<String> enums = keyStore.aliases();
while (enums.hasMoreElements()) {
this.jComboBox1.addItem((String) enums.nextElement());
}
}
} catch (IOException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (KeyStoreException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
}
}
/**
* This method is called from within the init() method to initialize the
* form. WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jComboBox1 = new javax.swing.JComboBox();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "Choose signature to sign with" }));
jButton1.setText("Sign");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("Exit");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addComponent(
jComboBox1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(
jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE,
75,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0,
89,
Short.MAX_VALUE))
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGap(0,
0,
Short.MAX_VALUE)
.addComponent(
jButton2)))
.addContainerGap()));
layout.setVerticalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jComboBox1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED,
23, Short.MAX_VALUE)
.addComponent(jButton2).addContainerGap()));
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
alias = (String) jComboBox1.getSelectedItem();
if (alias.equals("Choose signature to sign with")) {
JOptionPane.showMessageDialog(jComboBox1,
"Must select a signature to sign with!");
// System.exit(1);
return;
}
// JOptionPane.showMessageDialog(jComboBox1, alias);
try {
potpisi();
JOptionPane.showMessageDialog(jComboBox1, "Document signed");
// TODO add your handling code here:
} catch (KeyStoreException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (UnrecoverableKeyException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (DocumentException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (SignatureException ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(CompensateMeOnlineApplet.class.getName()).log(
Level.SEVERE, null, ex);
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(1); // TODO add your handling code here:
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JComboBox jComboBox1;
// End of variables declaration
@Override
public void start() {
}
public void potpisi() throws KeyStoreException, IOException,
NoSuchAlgorithmException, CertificateException,
UnrecoverableKeyException, DocumentException, InvalidKeyException,
SignatureException, Exception {
KeyStore ks = null;
Provider pjacapi = Security.getProvider("CAPI");
final Provider pmscapi = Security.getProvider("SunMSCAPI");
if (pmscapi != null) {
AccessController
.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
@Override
public Boolean run() throws Exception {
pmscapi.setProperty("Signature.SHA1withRSA",
"sun.security.mscapi.RSASignature$SHA1");
return true;
}
});
ks = KeyStore.getInstance("Windows-MY", pmscapi);
} else if (pjacapi != null) {
ks = KeyStore.getInstance("CAPI");
}
if (ks != null) {
ks.load(null, null);
}
ks.load(null, null);
// ovo smo ubacili
Enumeration en = ks.aliases();
PrivateKey key = (PrivateKey) ks
.getKey(alias, "password".toCharArray());
java.security.cert.Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader(
"Compensate.pdf");
FileOutputStream fout = new FileOutputStream("signed.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', null,
true);
PdfSignatureAppearance appearance = stp.getSignatureAppearance();
appearance.setCrypto(null, chain, null,
PdfSignatureAppearance.SELF_SIGNED);
appearance.setReason("Potpis kompenzacije");
appearance.setLocation("Foobar");
appearance.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1,
"jedan");
appearance.setExternalDigest(new byte[128], null, "RSA");
appearance.preClose();
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(key);
byte buf[] = new byte[8192];
int n;
InputStream inp = appearance.getRangeStream();
while ((n = inp.read(buf)) > 0) {
signature.update(buf, 0, n);
}
PdfPKCS7 sig = appearance.getSigStandard().getSigner();
sig.setExternalDigest(signature.sign(), null, "RSA");
PdfDictionary dic = new PdfDictionary();
dic.put(PdfName.CONTENTS,
new PdfString(sig.getEncodedPKCS1()).setHexWriting(true));
appearance.close(dic);
}
}