|
|
2001-12-20 microsoft: p ]/ C7 A$ y
( s# D5 z) k) V3 b
: @8 l1 }& l0 Z) S: F: g9 G 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 0 R: b) D6 B8 l t. c6 j
2 {' w- {8 s' g. d, [9 r 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 $ H" G9 l. N8 ^8 p
# t) a8 P4 i; L! w3 a 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
q' e a' F: w# S, S3 Q) P& F% d/ a; l! T* s% E& V
下面是创建签署CAB文件的步骤 :
5 h1 I) t: |. s* M; h, y
' n+ _8 P& D- f 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
t8 e* k2 R7 o7 M2 d; m! V! I3 C) q6 Q
2 创建 CAB 文件 / H2 i% z' Z0 {
* Y2 }+ W+ R$ x( W7 w" C7 w1 l: Z 3 签署您的文件
& F2 _3 ?+ y9 b0 }$ z- @+ g9 c: R J+ ?7 y$ v, c) V9 O
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
4 r8 ~$ f N# i& m9 \( V. M% K$ s
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 B0 g0 w1 j0 }
4 k/ Q" Z* b( ]1 d. y, b
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. % |9 Y' ^: Y& _" g# z. b6 T7 O
6 j0 r! h# v3 J5 a
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 3 O1 z k. e# |( d' t
( Z$ A5 _. E: o) d
获得一个软件出版商证明书5 M& \# _' x7 o- M3 h
! l# U# F( D' ^) r, \ \ E 您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 6 N1 L4 W7 q! t! ?0 i
- q- f: f) J, K+ {3 b7 C: j
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: * {. |6 X2 ]" G. U! e9 V3 N; {
$ Z: E, ~8 v- q1 }! Y
C:\CAB&SIGN\MAKECERT
+ o% u- u2 A2 j8 S- i1 k% I-u: MyKey " w) R9 l* N1 V. k5 B( z. V" d8 g
-n: CN = MySoftwareCompany 9 c6 s. ~4 Y8 R1 W
-k: MYKEY.PVK CERT.CER
; f+ o+ P- b. r1 a9 c) v' e K
+ _6 s: e0 m9 ?% U MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
- P1 h! T5 i( ?7 h+ u- r
6 `9 K. i6 L' o7 }1 [" B. T 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
- R! b/ ?! W, b4 a* i0 G8 b( J$ K2 p' ^
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 0 | G) l0 D3 O
3 b" e( ~9 L2 d' q8 ?0 v5 l 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 3 b7 Y/ I! L9 L- R: c, J& L. h# v
, [# A4 i$ _( c, Y. {
创建一个 CAB文件
$ W5 r d0 F8 Q$ `& g I) ^. h: Q1 g0 i( u
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 : Y/ y' O r2 X9 h5 m4 M
# Y7 Y) O$ `+ N$ M2 S
创建一个 CAB文件: : e0 C0 c) A7 q. |; X) y( M
* {7 w! t5 E- d% S 创建一个INF文件。 3 r6 N5 A! @) Q3 w+ J& }
; {$ c8 `: A7 z/ |/ m$ c, P" `- X
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 9 |" `, o k7 V6 u
3 z$ G6 z, O0 B- v1 q' IC:\CAB&SIGN\CABARC -s 6144
# P! |/ _8 P9 I+ mn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF * B. L, Y2 ~- Z' h' C" d5 G
$ w7 g3 f; g, J CABARC 创建了一个名为MYCTL.CAB的CAB文件。
+ |/ ?& \1 M% S+ R3 V$ V* Y. P* O. f1 Y0 ^) a4 {: M% c& ?( v% m
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
; ?0 Q+ o' a2 Q0 ~, o& G2 R' H
; U' t% Q4 f3 ^. R/ ` -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: 4 g' C3 d- ?- j o; C
l3 s6 F" L e' I
C:\CAB&SIGN\CABARC
" K! n! j1 ]' g8 x8 i! e
5 \" Z# J! ~8 U( d& ?* {/ f I6 M 创建一个INF文件 }" V" W# g% p& I; w! M
3 Z! T x, Y8 V* _
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目录下的内容。
+ a' S" F" n4 P3 W
& \4 x: z& r& o8 Q% |+ T0 Q: b 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
; r- B' y# _ x3 Y, `8 X
8 R1 r$ |; J/ Y4 }5 B8 }7 O; Sample INF file for POLYGON.DLL
7 i; D# x3 O! O% X[version] 2 N2 A& O9 @ Y' V, A9 Y
; version signature (same for both NT and Win95) do not remove
. s! t5 f l- ~( I8 p2 `2 Esignature="$CHICAGO$"
4 {/ J) P* Q( `AdvancedINF=2.0
5 L4 Y# ?! E5 G, b9 j0 v0 V$ B) ]* _4 i6 }" n
[Add.Code]
B8 g# P* i, O: Spolygon.dll=polygon.dll: j1 }" P9 M( _. G% k& T9 y
atl.dll=atl.dll2 j0 e4 [1 ]0 R
* P Z0 a7 a$ @5 d$ C9 U; needed DLL, }8 L5 ~. q* R2 z2 z
[atl.dll]5 W6 t6 S4 _- A( h3 ~5 z, `( ]
file-win32-x86=thiscab
' q* w) q! @9 ~5 v# PFileVersion=2,00,0,7024: O3 R n) m( C4 q' e# t7 e% ?
DestDir=110 w0 e/ U o* |6 X
RegisterServer=yes
% D4 D6 u( f1 v/ J6 X2 ?! F9 U. E* R% A2 x. }
[polygon.dll]
& d4 H+ h$ u& |2 L. j0 y/ Zfile-win32-x86=thiscab$ `) z- k5 L Z+ A; T
clsid={4CBBC676-507F-11D0-B98B-000000000000} & O3 a2 G! l3 q+ L5 f
FileVersion=1,0,0,1 . @% T7 r0 M# O! ]. {+ k
RegisterServer=yes
+ I' J, J' Q4 B- J2 s8 }( X8 D' F; T; end of INF file 0 {; }! A% `* y5 E+ H! ~
; m6 B; b. F' \# x0 i
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 5 N# k. c7 O; V
b- w2 n2 z" Q file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 8 Z* V6 H) m5 w) ]( h+ v W- z/ e
' m: A& C/ V9 k8 X3 t
关键字"file-win32-x86" 指定平台是 x86。
, S& E b% m" P4 J- y4 I8 `, A$ f5 b$ X
得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 # {5 S; f& b' q3 V8 G `
8 _3 v2 ]( |5 `5 ~7 B3 }: P3 R "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 " m& b8 ]( \4 r+ G6 w O
9 x& T. {0 e9 x. A# H9 P& { "clsid" 指的是要安装控件的CLSID。
2 I2 {/ o$ B7 b- E4 ]/ ]( o% r3 S- M. p, p* R" l' R8 d3 h
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : / x% s; q; \4 Z+ F8 N) K9 G
- G9 c# q6 T. e$ G. c" i
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
% r5 d; H0 h; I6 \0 ^: w) V( ^
m) j# B1 \( Y' Q, r4 j3 V 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
9 i( t* G6 ^; } c( v1 F; @" W \) u5 B8 t2 y3 x, R2 R, d. B2 h
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
6 L( L7 F E5 Y8 E8 _, n7 P* a6 H( Y. r" c: F
签署一个CAB文件6 O ?8 k; e" V6 j3 j9 l
0 r% }# i9 ]8 i" W1 k& x
使用Code Signing Wizard签署一个CAB文件: & y& j2 G* Q( k9 R$ m& J, ~
2 W6 D2 i0 Q \ o
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 * E/ K' b3 c6 Z) Q" D) q" q* v
& n4 f) A" o/ o0 q8 g C:\CAB&SIGN\SIGNCODE- j8 p+ _6 g8 Y) ^7 P; r4 d
( @/ {* Z' g M. E7 g
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
- Z1 A, i6 s2 R0 W- k3 g# `9 v* |% [$ H; v
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
/ i# C# z3 \% |
) N: x, r2 m' [$ a, g- S: G 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 & m1 p+ `9 V. W! G
$ ~& r: f3 U& E$ B
- z. S( W3 x8 `+ L" y
5. 点击Next,前进到下一页。 8 b2 h/ n+ M. K& I# V+ A/ E1 t* j9 L
& J* \/ T _- F2 x5 G
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 9 [. V2 w8 o7 T) G7 c% Z. S
, ~# ^0 @! x, W, ^% C1 n
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
" F# B2 w: a# i/ }, N/ U8 z& j9 _/ l5 z, j+ Y4 j
8. 连续两次点击 Next前进到最后一页。
+ D' ^+ W* t# I, _8 [1 P- Y; ?
% Q# v" r4 s1 {9 J# g5 q( } L 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 # g# ?1 G2 G# M+ p
+ n- |9 X- [3 L( ^. Y
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
: }) w7 n& b, S" E1 [, O8 s9 w; f
将签署过的 CAB文件嵌入一个Web页
+ g4 p: h) B w' z
% k, x" b u3 j/ k4 X ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
4 J; b- b; }9 _% ~; t9 ?1 f: ?/ X# ]/ @
ID - 控件名称 $ ~" u2 Q9 C$ P+ d4 v7 _
5 v" ~* _ b) g CLASSID - 控件的CLSID 2 r' A2 X8 V( T" }3 P3 K
" i, m. E5 g: s$ ^0 z
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 2 h" a" O2 Y( ~' _5 L/ h' C
$ S1 ~$ E- r* ? r% `- y
CODEBASE可以直接指向一个OCX 文件或者DLL文件: {0 `) E5 B/ G0 Z: w3 b
8 e; b! t" a1 |$ e' l
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
: } { G3 Q) ` v2 E7 h; S8 r) R; b6 k6 q
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
5 U' ]# C% M: c+ U: N
8 y" i6 G* t* N. F 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
& m- G. @/ A' C
3 ?, C3 a1 U- t3 A5 J; i0 UCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ) U1 c: K5 b* j: ?' r) }
) J5 W7 X( W% q4 l, ` 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|