|
2001-12-20 microsoft
( [# R# r, |# j0 B, L: d! g1 U. d+ w
- z7 \7 ?" I# [ `, |! q8 W 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 9 \. {, r6 |4 W' s$ n9 { y
. A& f4 a- @" x& ` 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 ; I( w7 [0 ?3 m( q4 l! k3 X$ C& w
2 u3 @6 W* G( N) U: X 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 ) T. X& d( W! `- h+ P2 w
5 k5 T' }1 _, u9 C 下面是创建签署CAB文件的步骤 : , r0 l$ d8 C c# ~! u# }
8 S, K/ J& F9 C1 `/ ~/ U 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) " i0 ]$ j/ W ], V- A
) G$ @$ `; c. T( F6 x
2 创建 CAB 文件
1 [+ u: \' J- Q6 N# g8 f( A% G6 m6 `; r) ~$ k% i8 Z6 e
3 签署您的文件 & q+ P6 N4 f5 W C2 D9 o9 x8 e* v) o
- K8 \0 p; E, H" Y3 Y; e. i$ o' I
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
0 f2 M8 s! N$ A
5 B( @% T* ~0 \7 ~) ?6 Q 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 ; P" ?! c" o9 L- j+ [
% }4 m$ p' k- |( {% C' k
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. ! L1 \3 {3 f8 x0 N* q9 A
" E6 M1 b# \* e7 y) I
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
~+ Y$ c- F! L2 N
0 S" f" m$ ~( l- j+ v" M 获得一个软件出版商证明书0 P1 [. y! \9 n& R' s( K& a
3 [7 N" T4 L s
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
* R- O$ q7 A0 ?% }4 J \# f" ^& Y- Y# k: D! J
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: ) L/ W) C* B7 P4 m8 b5 @4 I: z4 r
# Y; @5 u; P M& i; C. V: Y# i
C:\CAB&SIGN\MAKECERT ' L# z5 |( x# w5 \+ A4 E
-u: MyKey
" @' R0 j5 _3 e+ k' _% t/ W-n: CN = MySoftwareCompany
6 d" M' L5 D" u; l/ M-k: MYKEY.PVK CERT.CER , L0 o: g B# U' [- D) i, G- _
0 H, c( D! o# V! y
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 % |& z# C3 o s7 |! a9 V! b' A
% I; k! v# f7 u6 o 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 0 X9 E; e. p% r0 z5 N7 g
4 g! i( h8 w2 L) {C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC . q. ?% Y7 ~0 l! i
5 x/ l# \0 o* O/ x0 Q
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
R4 q% b( G9 k; V) i- G' h3 y
- _+ D/ l; d8 u 创建一个 CAB文件
! P# y' w8 \9 }+ S8 n" b
% f7 g3 t e- I: |; Y 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 v% B k3 t' z
* P5 k2 R/ ^' t; c
创建一个 CAB文件:
% ?( U2 z _1 Y; L5 L4 e' g2 Q% q5 r w) R3 ]$ X4 E" B4 i
创建一个INF文件。 % \/ p3 j, F2 A* x$ k- X) k# O
: \* R1 Z* p6 a( H1 J+ X 运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: : I% V7 k; f b- x y8 o. V
7 h. f8 m" z; a6 r! Z0 @C:\CAB&SIGN\CABARC -s 61449 K8 U7 V1 h& Z! E' u
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF / ~6 e) s/ k) A
5 z/ O7 q0 ]- T2 f7 r0 O, ^ CABARC 创建了一个名为MYCTL.CAB的CAB文件。 ; [, o0 n: Z/ t) ]6 _0 r" i. }6 T
- v- @# r! g0 ] Q
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
2 v6 U/ S2 w6 F( S# d' t% i
; {& O: E% g* c# p- B' |/ O6 X -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
8 @: k5 H# e5 p3 s8 f) i0 u. D ]8 O6 L# m5 E% O6 {% M, d
C:\CAB&SIGN\CABARC * ^# ~: Z5 x- R$ v6 `
& \' c6 E) m& @& B l/ c 创建一个INF文件
3 G( }" Q' ~& V. J* r2 w
- e5 n- W. K1 j) v3 A8 l( x 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目录下的内容。 * w) i0 N N: ~; E1 |" e' J! N1 L
1 X+ c, f# h' {9 {1 K0 L. j 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
! S! v" B% E) M& D7 {# ^: D# g# d2 x/ m* M' V! E0 S, h& L& U
; Sample INF file for POLYGON.DLL
. j+ T7 b! o; h/ u& k[version]
" d+ y8 Y, I' c, s& [; g; version signature (same for both NT and Win95) do not remove
/ ]" T' V7 e9 F2 ]' x* u3 Hsignature="$CHICAGO$"
% M$ V$ R' f' u: U: cAdvancedINF=2.0
! F0 l& ?# I6 i% ?, M5 v# e
' @" h6 Q$ I) S[Add.Code]
$ d3 o/ I! G dpolygon.dll=polygon.dll
! R, a7 K6 G1 I7 ^0 Oatl.dll=atl.dll
1 v- ^ d8 |/ Y p; D& w- G/ {1 d1 c: Y; q7 L
; needed DLL
% M9 Y$ H- R* ~# `, ^[atl.dll]
! P8 r7 Y4 `9 G( Q% Q0 Mfile-win32-x86=thiscab, u3 F K/ _/ S9 W6 J; d
FileVersion=2,00,0,7024' L' y& Q8 k2 n1 `" D% [" ]& w
DestDir=11, a7 C* o* b: G1 R4 P8 s
RegisterServer=yes . s- I) s' s5 f+ }
% y( r% Z) [) E# U' h# z W6 {
[polygon.dll]
7 q7 O! R- {8 l" j+ }% ~file-win32-x86=thiscab
( _* _# S! p+ v x1 Vclsid={4CBBC676-507F-11D0-B98B-000000000000} 8 \. b/ p' O8 Y2 Q
FileVersion=1,0,0,1
5 }* n- A- z0 F1 Q& yRegisterServer=yes) L6 _/ n2 Y# a+ r7 ~8 `" M7 j
; end of INF file * ?+ `- T! V6 T
) U/ y; r/ n9 Y+ U% U
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 6 c$ W0 v1 }8 e3 v
h$ i8 b& E3 b V/ w j7 k1 x file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
# U8 N6 C* _) z" u- I0 m% H# o9 t. t o1 G8 Z% h9 q$ M$ s) t. b; S
关键字"file-win32-x86" 指定平台是 x86。
& P7 X" p: ]6 x! `/ _, C
' H( g( J- q5 e 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
9 v4 A+ ~+ p/ x0 ^2 {8 [8 U/ l7 v4 p5 I3 J, C' t7 q
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
- B+ l U; H H& G$ Y: k# B/ m3 |3 U1 J6 G7 D
"clsid" 指的是要安装控件的CLSID。
/ P7 G+ y, s8 ]9 p( D7 Y
2 x* H. ~' i! h9 J7 {; R 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 0 H" ?# `7 @, h4 a
2 _& P/ N6 f7 R6 }' A
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF& S ^, P8 `9 L5 r X8 z
* A+ m# n/ Z# c7 }- d0 l 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
2 f% i9 |9 e2 M1 F- M5 _2 f
( ~% m4 u: g) e, @, f3 z" v% M. a 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
M) K F4 ~) y: o6 ^, d' i- u/ _1 k
签署一个CAB文件
$ D# u- ?5 l" X: k e2 m$ j+ x* s
使用Code Signing Wizard签署一个CAB文件:
! P R0 e2 z- K7 x
& M( y1 R" `- ^, N8 q+ V) ~0 H8 h; g 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 . }* w, \* V, a- u/ b
) v, n8 O3 ?6 t( P1 d
C:\CAB&SIGN\SIGNCODE
' W0 u" T- Q6 v
+ Y0 R) z, ~' k& u! p 2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
, |7 Z& M: J0 v4 a3 K. t6 I; G
8 K7 ^0 v4 E1 m. q7 y6 q 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 9 N3 X& Y7 E& G' O( d D, f
3 \/ f5 ^& z% ` 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 6 R7 [" y+ O. Y# g& c5 I I/ U
P- \7 f) R U% F+ W
/ U: g2 R( L7 i9 c- w5 F8 `' Z
5. 点击Next,前进到下一页。
& X! ]0 w, C6 p3 F5 [5 S7 L' Y% p
7 W" K0 r$ `; P |. g- ^# }6 Y 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
* M. k/ P- D* X7 H! n
7 e0 C! v) N0 w1 @/ K: Y% I 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 6 x; D7 b0 ~4 n) c, W
! M" z0 l6 k( }0 ^8 k$ B+ i
8. 连续两次点击 Next前进到最后一页。
4 k1 c3 m) B+ S W
' ]6 V! X0 ^6 g* R' y 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
% o6 p: i/ ~& H7 I
0 \/ g3 L$ p) V( B6 b 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
$ L; W6 i) w3 a& \. r
1 ^1 U) W) h- g8 D- A 将签署过的 CAB文件嵌入一个Web页3 j. |, M' k" X: W! e9 a
/ A9 H, `/ i0 i" a2 S) Q
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
& s: y6 Y/ y8 X* l4 y5 U# p5 E, T* o1 k0 w) F2 L, m
ID - 控件名称 3 L S( t9 `* J% A6 g4 ~* i
' u/ w" W" e8 p! N+ F CLASSID - 控件的CLSID
% g$ h Q8 k7 x b* y; V2 ?
# j8 K! A) |+ w* ~7 ~ CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
; u* t3 H9 b6 ^8 j6 p3 Y
$ f. h' ]5 m, A6 {7 d6 z- |8 X CODEBASE可以直接指向一个OCX 文件或者DLL文件: 5 N( u2 J$ q! T* s6 V2 R8 K
3 R! y, I8 _1 a) V6 ZCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" : s. m4 U- V# l2 B) M6 x) Y8 ?5 }# J# k3 W
* R9 t; [" ^/ k# G2 g4 T( K. J
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 - G) C5 m E. S* ~! u1 a
4 w* |% b. w% C' ]' j7 g& F
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
$ Q/ T7 Y8 b" I( |" c+ y8 T
$ l, q$ f, T j# HCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
b% b: ~0 L+ f" S, u9 I3 B
' }" p4 o4 j% w% Q) p2 F' b 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|