|
|
2001-12-20 microsoft
7 c/ R8 q/ m1 ^- l9 A/ X! L+ u* P& g) r' p6 R
7 n0 @: o" p ] V) f3 p 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 . R8 q* M0 T+ b$ |/ b
# o1 X* A) b5 h9 l) b& v+ A$ D 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
$ x( |% |1 d; a3 c: S B* a9 w) q, N, Y {8 `% g" e: j
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 2 W# q' F+ V& X4 U/ {5 c. j) M4 e
1 U$ ~0 X/ h! i/ g4 \ 下面是创建签署CAB文件的步骤 :
: |) @* l0 Q- F Z% J f
% z. P+ x/ k- U# t+ K) t 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) * n5 w# H" F- c, I7 d
) d8 B9 E" ]4 e _& p, [
2 创建 CAB 文件 7 z& e- Z; Z% U e/ u
r$ M; b- J' ~
3 签署您的文件 # |6 z$ l; D/ F) ~. q$ v/ R
/ ~/ e' x. J% Z4 t2 C% e, I
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 ( i3 |8 X3 y+ [
$ p( d' J& i# P! e: D/ x# Z
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 " B% E) u9 u$ N2 @( i
; _# Y' P5 m: T# B& X
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 3 L( R8 D* J1 J. y( E. Q7 O
0 v8 O+ K2 F* }" W" ^" v0 ~ 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 2 q+ O2 h7 e! H3 @( g
- p' X$ j9 a# w# E* _ 获得一个软件出版商证明书* F1 m4 J1 D J; z7 P8 o
: W: N8 g1 k/ ~0 G# G3 z 您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 / h" V- F# X. n Z, O
( ~& c& b d" b" ` 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
7 W/ @8 X# d7 H7 o9 z$ `
! T% w" ]6 Q0 [* F& vC:\CAB&SIGN\MAKECERT
! n% Y9 q- n5 }' p/ }+ U" s-u: MyKey 5 w; G2 e) x1 G: Y
-n: CN = MySoftwareCompany , u" y' _' ^3 x$ z& {$ M8 _
-k: MYKEY.PVK CERT.CER
- S& l/ y( x+ j. t; S# Q5 o
) o1 Y# G* Y* E+ I" q" t/ G- k MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
9 c8 c8 c O$ \( S3 d8 B8 t! b( n' F' e8 ?- `
做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: ) S& j/ B# ]2 W4 K5 S1 n; K
# E; o' H' I; Q3 ~2 ?: nC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 9 t8 a+ Y0 @( }+ j6 D( C
0 i; v$ ^: W1 }- D/ I' C
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
' D& U X) p/ O3 ^2 A( Z% G& b5 q& D, a; R4 y
创建一个 CAB文件% p y: D V2 f3 o0 e
/ U) N2 E- [$ Q) s) n) B k- g 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
# o- w# ?" \& R% ]
& M$ F; c# H7 s: u! {' T3 z 创建一个 CAB文件:
- U8 x8 n$ ^, D# X- T' T! E2 @6 b
+ S5 o5 n8 M& O$ Y: X3 f" q& m 创建一个INF文件。 # c+ ]& O0 q E2 ?
* T9 O. A5 a* z% H3 Z7 H3 X8 e+ t
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 5 I$ \% o4 G4 y7 h4 D0 c
; K2 E I# O& [ o# C. nC:\CAB&SIGN\CABARC -s 6144
. r) _! l( V" y/ b% M) E) T0 G3 Tn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
5 i& Q( F' s- f# _' B# E
2 F$ |( @7 @, k w- a, a( X5 Y; X CABARC 创建了一个名为MYCTL.CAB的CAB文件。
' S5 V( Q4 i4 c* F9 N8 ?
" H- D: y; ?1 ^1 L. S% n" Q% | 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 8 l& A9 j3 Y- I
* a3 ?2 s! z$ }1 t0 P -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: ! h6 r5 ], V/ D' N( v5 Z2 i
0 v- q; O8 g9 Y0 |( E, |) H( b C:\CAB&SIGN\CABARC
2 C. J- g7 k5 u* K
+ i1 V9 o! N" b9 B0 \" ~ 创建一个INF文件& `+ ~8 N$ M& H' H8 |
" S. u5 I+ S6 q5 w) w# s 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目录下的内容。
1 H+ \# D' l9 `& r3 L: Q D& [+ r; Z b# m/ |) a
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 % Y8 U8 `9 k- S3 m4 j& h
1 B: U. {) H" Y" B9 y; Sample INF file for POLYGON.DLL+ ?* a% I3 J( ]# p: l
[version]
0 e0 C' e" v. c( S: N: z9 v K, e, P; version signature (same for both NT and Win95) do not remove
( F1 ?+ d6 ~# _2 }signature="$CHICAGO$"/ `# w+ V" |" i; B8 S
AdvancedINF=2.0
, s# Q# {+ n1 g8 q( N7 a0 g
6 X! j. S- X# l. c- c[Add.Code]" T3 k A C2 W* B6 k3 z
polygon.dll=polygon.dll
0 h/ Q! h9 w4 W. G. @& J8 matl.dll=atl.dll
+ O+ R' a N# }
9 s8 z- c9 [7 z \; needed DLL
5 {! ~8 K4 _) _* x6 P# u[atl.dll]
* c8 @4 p: @8 ^6 H* P, P7 efile-win32-x86=thiscab6 x5 Q# {2 B6 x/ X, ~- A
FileVersion=2,00,0,7024
* v% O7 |% X8 H6 w* xDestDir=113 Y( M5 H' F) _( {- p, q! z& `
RegisterServer=yes f. P& c7 {1 ]& e, O! `, n
& E7 f: ?/ {1 |9 ]( _7 `( p6 u[polygon.dll]
7 `3 j* }6 U' R5 _file-win32-x86=thiscab9 ^# N% W" {; Q. E7 ~
clsid={4CBBC676-507F-11D0-B98B-000000000000}
9 F. F: L: \, D$ zFileVersion=1,0,0,1
3 w8 k3 I5 a: R0 L' J2 N a p* QRegisterServer=yes
, R, [' V; ?* l; end of INF file # a3 B" a1 g% E# p" ?
" r; S: v' Z2 n5 F5 \) W6 J
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
( r( @: V" f+ ~& I; N& F+ M2 ~$ a5 G: f3 B9 A' F) _" s% e
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL $ x( }! P: z# {+ x- M- c7 v
( i- g* y2 h- X& I& { 关键字"file-win32-x86" 指定平台是 x86。
( t4 O( f1 Q k& Q! b- O$ L: x3 l5 ]
得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
- U% _: s3 z$ P1 ^, ]5 W
o: Z h( N7 s "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
- ^7 [0 _4 H" _, t* }3 L- d0 ~- h% j0 n* s
"clsid" 指的是要安装控件的CLSID。 2 P K5 o( J4 t+ S b
3 x9 Z* f. s8 a0 l7 M' E
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 0 r. c* Z) K4 d4 y: q' r& l
: p: |; ^9 d! I1 a/ Y
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
, V( H2 }- M u( n- Z9 `$ ~* H' f. |+ }
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
W, n1 r! x1 U; ^
( t7 n/ s2 x3 z 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
* @7 o- H+ _. I8 R* H: |1 [/ q9 E/ p
签署一个CAB文件
5 X& U" }- C% d; m
" R8 A, E5 N7 B) w* x 使用Code Signing Wizard签署一个CAB文件: 1 a* L" |5 F! c" f* ^
0 n B9 ~8 n& |( E: Y: M 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
- E" u$ q S* J4 j9 D1 z
9 g+ o# P3 a" ^$ {& B6 |, [ C:\CAB&SIGN\SIGNCODE
F+ }, Y0 D: {! u- d' o) z, G8 _( u
4 s: s6 g0 s2 ~2 X 2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 ' a8 B7 r& _& ?% X
: Z# B4 U; W+ G) V" x/ w
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
( j' z" S5 ^4 n/ h. ?2 D# d- Z. U6 J/ z4 T6 V. C
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
0 v+ X9 M% b' e
: V* F4 U) B/ n4 z
; k1 c. R# P1 A& Y8 j8 f0 c 5. 点击Next,前进到下一页。
. J5 o' v2 b1 o# ?
! j, ]! j" |. b) ?. V 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 ' [* x. F: k0 \8 e4 _& D
9 b7 n% C/ E$ Y+ ? 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 5 I, ]$ L8 k0 D
* Z0 h6 ]" h7 O. k0 o
8. 连续两次点击 Next前进到最后一页。 $ J1 x. E0 n! c" v1 j
. Y5 s) u/ q( L" ` 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 ( V3 I* [7 R% Y( k$ l
5 K! G) v) G }0 C& t/ d. e
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
: R+ n' t5 A, s8 U7 k8 l
, N) g; W! e: I1 \9 ]! B, ]: J4 k 将签署过的 CAB文件嵌入一个Web页' v. {$ J- F. A
6 D; c& r4 y, f$ c& c
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
, k9 F, I4 s4 M) C% t# `) z2 C V- y. [
ID - 控件名称
1 q! A- u+ }, p1 q3 J6 r# |. F
d! S4 K9 U0 [; Y, N CLASSID - 控件的CLSID 3 N; f: O+ y! L4 u6 f
# p9 m8 n [' m+ Q, E1 i1 { CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 : H2 {. x% y! Y1 L& O$ X- @* T7 L6 W
- _* c1 V: l/ B" q
CODEBASE可以直接指向一个OCX 文件或者DLL文件:
7 ]6 g* U3 O" \& N" x
7 |" l- b1 }0 h5 ^0 @CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
7 C( J3 c0 c! U: {: V% z3 V: ~2 F9 O9 b2 b
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
; l4 C. O: A* K* `+ c2 f- u4 y# Y# H0 c1 D o. m- q5 |9 f
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 6 U- O: {4 a. @& C9 q
% E o3 n3 x) t$ m
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ; j- A: H& Z8 |( j+ k
$ s: m% h1 }6 z; a1 O1 x* x
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|