|
|
2001-12-20 microsoft
: I( p9 h3 x4 l
1 X# }4 x5 d9 d4 }, ~& r/ @: `7 S3 j: ?7 | }; W
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
$ ?; b8 ]/ k3 z' C% ~, _
% \2 c! ~5 t+ ]! U+ J5 [$ [ 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 , ~: V" S1 ~8 V; `
5 d. R+ Q6 R" ~ T, H: D; r
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
+ d2 T) a* q4 P+ J5 P" }
1 z9 ~* C/ |3 ^6 ^! n7 T( V 下面是创建签署CAB文件的步骤 : ( c7 _" E! L6 O- @: {! z) d5 y
, P: _$ N, k% f g 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
: @$ T2 z+ m3 C1 l0 C% a" q# p# I/ ^: T* w7 d7 M% `$ E
2 创建 CAB 文件
$ b8 j$ ]1 ]/ A0 |1 L
, S+ _% V7 }; W3 w 3 签署您的文件
3 \. @2 M: M, N4 N& u \& F0 k, Y7 m
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
0 H% y* `- j% y0 W5 j6 S- `
" b9 |' k, `$ P; F* y/ m 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
, {+ y7 r# r( p" a& J6 b2 Q
& h" f ~0 Q# x) Z3 S 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 8 w# `5 b" S; Q" K1 ^
5 a4 V6 m7 H. f 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 - v7 `# |& y. T |
; m! n. m, v. u' }) C: X
获得一个软件出版商证明书
! q2 V: z/ K x* \$ R( K3 _6 j2 Z0 V# j3 D8 s
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 0 P* w, b5 [; U9 A( t
' m5 j- N0 E ^' K- _9 J X; a; H/ ? 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: + h, w2 f6 h2 A& U& M3 C
) v R3 L. ~, B! M$ f
C:\CAB&SIGN\MAKECERT 2 V3 m8 K' n1 G$ U
-u: MyKey ( A% f! q! D" e" N& B# w
-n: CN = MySoftwareCompany
d" F# f) L. }1 |2 Z-k: MYKEY.PVK CERT.CER
; l( P4 `4 m" ^, T9 [* r0 C4 X F& M! |# f8 _7 m' ]0 {; R( K( w
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
! P0 o) ?7 `- }( \* x+ i# M* y& v& _6 Q [: h& h. s
做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: " I% N' V0 x1 C" P% r+ C4 Z, A* O
( T. n1 ^ o. v- J0 X& K8 X8 V
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
' S. i5 H0 U) s: q
/ P! V Z7 K# A7 M; a0 T+ h 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 6 A4 I5 m; e8 b5 V @' A& ^5 q+ ?
/ E( e9 p/ r2 \* O 创建一个 CAB文件. }0 i/ T* Q$ [0 u
9 w2 n+ B, L% { 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
" t: G, I& i0 x ~
8 T4 ~7 F/ j5 { 创建一个 CAB文件:
* U, h3 }- |0 ~$ [: ^
" b' o3 V' H. s1 L 创建一个INF文件。 & y! d& M7 W" q3 Z" O
% _. {( d+ q7 N
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
1 h! H( J( X3 }4 U1 R% J1 D: k5 ]! T. u. }9 f* H
C:\CAB&SIGN\CABARC -s 6144# `4 I0 h+ X: \
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
' ?- A5 b/ X7 W O6 o
9 Q: W; [; H' I |) ^! ~ CABARC 创建了一个名为MYCTL.CAB的CAB文件。 2 X' A6 Y: f# p# F! H: N7 \& K
- O/ ?! j3 y' k! m" ~7 P
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 / p) E1 Y" L& N* e! v; ]
* X5 q: F; @; U8 k% m -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
6 o( ?8 x& N- L: h% m4 L* C; L+ J$ y
C:\CAB&SIGN\CABARC 3 c0 U1 P4 t! f4 i8 W" C
0 Z$ u" D/ }1 O% Q6 N
创建一个INF文件/ \7 p6 }4 I3 C
3 b- W w/ O7 m. d, ^" q
INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。
2 H" B k( v0 ?# g, }
& V. {, y: d$ h7 m" Y; a 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 / |* v, v; I J* g/ }7 Y% Z
. u3 {! w% _# K" j$ F1 u- t
; Sample INF file for POLYGON.DLL
: p p) H: g6 Z6 w9 F! x[version] & C& Z2 X' @4 l1 m9 o2 M, v% b
; version signature (same for both NT and Win95) do not remove1 P3 I: y+ Q2 D) |
signature="$CHICAGO$"
( N( g! K! G. Z* p0 E0 QAdvancedINF=2.0% W1 u' e! r/ U+ U$ g
; ~7 |) F, W# g2 A" ^; @5 \0 a[Add.Code]
: E3 l0 @9 }; P( V: ^, Q- R/ J cpolygon.dll=polygon.dll9 J( d' s* b! I2 ~
atl.dll=atl.dll$ X1 A* o/ K' |" }
; K& _1 t& R8 d1 `# A" |( s
; needed DLL* B5 @! Z6 s( ~/ l$ Q/ |6 L% Z. D
[atl.dll]
8 v- Y7 L; V s( R% Rfile-win32-x86=thiscab: }# _+ ~# Q7 n/ `1 s9 G
FileVersion=2,00,0,7024& Y8 ~" V6 j9 C
DestDir=116 H2 x2 [3 ^/ q; [) C. o- x
RegisterServer=yes 6 |( s& k& S S ~# p, |/ l
9 I: t2 q# H( ~0 @: N }, @* Z[polygon.dll]
3 G9 e) H3 q0 |: xfile-win32-x86=thiscab
( _+ Q6 h2 C% z2 @4 s& s/ nclsid={4CBBC676-507F-11D0-B98B-000000000000}
2 O+ v$ M1 `5 f+ G4 BFileVersion=1,0,0,1 5 Y" G+ J ]6 Q* |% q" G
RegisterServer=yes$ Q; g; u- g& m& ^
; end of INF file ! }+ |, q+ v( A- o; ]. K. ]
# W8 ?! g# k" d- `' R 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
! w# H6 _3 |1 K8 d. n A f% m# ]" k. S3 J! L1 J
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL ( ?/ @( Z% I/ [
8 b$ K9 T$ o' p 关键字"file-win32-x86" 指定平台是 x86。 0 L3 G7 S9 [& @' a# S% ]2 h# q3 x
5 t2 {9 b6 M" {2 @3 J4 M 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
& o; e% T; c- }
! v" H Z9 I7 Q "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 7 G* f9 e3 ^7 b2 E2 Q! e& {! Y6 X
. x! K9 ^3 y. L; M( d E4 ^# F "clsid" 指的是要安装控件的CLSID。
' u& {3 ]; r) K$ @
! z5 u, o$ T( I+ d4 u8 O 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 1 C, O$ Y/ `1 s5 R, Y* N" J
) K3 s8 P' s9 M' O+ A1 Z C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
# ]! E( B* L6 W" X& ~7 l' L7 ^7 Q. H- E$ d
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
4 ?% v. D7 r% n2 X6 R- V* \" g1 X1 W9 G
! r- i; h1 u* Y$ x 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
9 M7 o6 O ~' c/ x3 t; P* F+ A/ _9 b9 \
签署一个CAB文件8 l) D4 Q1 k/ p
; x: I+ e( U- I% l 使用Code Signing Wizard签署一个CAB文件:
+ |' H* F7 F/ i J5 m
6 F) f( J: U& d 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 1 F, U5 i/ u# p; `9 w
1 W, H J3 K7 b u, `4 W6 |8 P
C:\CAB&SIGN\SIGNCODE1 i) n1 n |' L, D- y$ W
( Z: c4 q3 R2 }/ A
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
, P8 P; x5 |6 U0 U, e* y7 W5 I3 ]
1 Y" n B+ [3 I6 U6 F4 z2 O3 j0 p6 ^ 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
+ K8 y6 Q# x0 s4 h
- S2 X" L: H6 y. E% d8 H# j 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
1 N0 m: c" O: ]: x* I/ N1 B
2 t4 h! i# `: N/ [5 f& Y- |
8 R& `% T. q; c0 ~! ^; X 5. 点击Next,前进到下一页。 9 K; m6 u9 g% P4 K2 {2 W5 v
9 y, P( h7 [5 s9 D
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
3 b( _( M/ ^# E: W8 O9 O% ^ y6 n! {# P1 j; e* E" G
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 ! }2 B4 c; P2 \, h/ C
; k+ j) A; a9 J1 ~9 e2 x 8. 连续两次点击 Next前进到最后一页。 * d; g5 W7 j- Y8 H( N
2 Y( ^! V0 A7 K" d/ I
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
) a. @6 p/ f$ `# k' K& e0 E3 R$ g9 q% P& x/ z' F( @
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 ; K P6 I5 E- @6 c6 _! [
& K5 N9 K1 l B4 L- b: p+ {$ \
将签署过的 CAB文件嵌入一个Web页
& m+ L1 X4 q+ L* u" d3 n/ q
~/ f7 s& |) V" D+ w2 Z" \) N ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
3 q. o: z& ^' @; a. s9 [. T1 u( }, M- X8 b
ID - 控件名称 3 d( O' C9 k% N+ C3 {
' j3 Y& [0 t) J
CLASSID - 控件的CLSID
" w& m+ M T5 f9 h7 S
$ X7 W( N" [$ q0 U( F' e0 n CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 ' ~' k) L0 H! O/ h+ k# i
6 y' q3 x) e3 a
CODEBASE可以直接指向一个OCX 文件或者DLL文件:
1 F, l, S; V$ L1 o; L* c2 O: y) s( v
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
0 U5 b, l$ J7 b
: Z" \. T6 M6 S: C$ N 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
: X. b% p7 A; o- [
/ i: I6 c1 n$ ^+ X! b, k$ N; [ 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
* c+ P: e) w$ a' t; M; \. U1 c
: }0 F, {: w R3 GCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ' U: H" i) j7 S; ?
& b2 M7 y2 E( |8 t1 W
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|